आउटपुट स्ट्रीम, क्रॉपिंग और ज़ूम

आउटपुट स्ट्रीम

कैमरा सबसिस्टम सभी रिज़ॉल्यूशन और आउटपुट स्वरूपों के लिए पूरी तरह से ANativeWindow-आधारित पाइपलाइन पर काम करता है। GPU, वीडियो एनकोडर, रेंडरस्क्रिप्ट , या ऐप-विज़िबल बफ़र्स (RAW बायर, प्रोसेस्ड YUV बफ़र्स, या JPEG-एन्कोडेड बफ़र्स) जैसे कई लक्ष्यों पर एक ही फ़्रेम भेजने के लिए एक समय में कई स्ट्रीम कॉन्फ़िगर की जा सकती हैं।

अनुकूलन के रूप में, इन आउटपुट स्ट्रीम को समय से पहले कॉन्फ़िगर किया जाना चाहिए, और केवल एक सीमित संख्या ही एक बार में मौजूद हो सकती है। यह मेमोरी बफ़र्स के पूर्व-आवंटन और कैमरा हार्डवेयर के कॉन्फ़िगरेशन की अनुमति देता है, ताकि जब सूचीबद्ध कई या अलग-अलग आउटपुट पाइपलाइनों के साथ अनुरोध सबमिट किया जाए, तो अनुरोध को पूरा करने में देरी या विलंबता न हो।

समर्थित हार्डवेयर स्तर पर निर्भर गारंटीकृत स्ट्रीम आउटपुट संयोजनों के बारे में अधिक जानकारी के लिए, createCaptureSession() देखें।

फसल

पूर्ण पिक्सेल सरणी की क्रॉपिंग (डिजिटल ज़ूम और अन्य उपयोग के मामलों के लिए जहां एक छोटा FOV वांछनीय है) ANDROID_SCALER_CROP_REGION सेटिंग के माध्यम से संचारित किया जाता है। यह एक प्रति-अनुरोध सेटिंग है, और प्रति-अनुरोध के आधार पर बदल सकती है, जो सुचारू डिजिटल ज़ूम को लागू करने के लिए महत्वपूर्ण है।

क्षेत्र को एक आयत (x, y, चौड़ाई, ऊँचाई) के रूप में परिभाषित किया गया है, जिसमें (x, y) आयत के ऊपरी-बाएँ कोने का वर्णन करता है। आयत को सेंसर सक्रिय पिक्सेल सरणी के समन्वय प्रणाली पर परिभाषित किया गया है, जिसमें (0,0) सक्रिय पिक्सेल सरणी का शीर्ष-बाएँ पिक्सेल है। इसलिए, चौड़ाई और ऊंचाई ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY स्थिर जानकारी फ़ील्ड में रिपोर्ट किए गए आयामों से बड़ी नहीं हो सकती। न्यूनतम अनुमत चौड़ाई और ऊंचाई HAL द्वारा ANDROID_SCALER_MAX_DIGITAL_ZOOM स्थिर जानकारी फ़ील्ड के माध्यम से रिपोर्ट की जाती है, जो अधिकतम समर्थित ज़ूम कारक का वर्णन करती है। इसलिए, न्यूनतम फसल क्षेत्र की चौड़ाई और ऊंचाई हैं:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

यदि फसल क्षेत्र को विशिष्ट आवश्यकताओं को पूरा करने की आवश्यकता है (उदाहरण के लिए, इसे सम निर्देशांक पर शुरू करने की आवश्यकता है, और इसकी चौड़ाई/ऊंचाई सम होनी चाहिए), एचएएल को आवश्यक गोलाई करनी होगी और आउटपुट में उपयोग किए गए अंतिम फसल क्षेत्र को लिखना होगा परिणाम मेटाडेटा. इसी तरह, यदि एचएएल वीडियो स्थिरीकरण लागू करता है, तो उसे वीडियो स्थिरीकरण लागू होने के बाद आउटपुट में वास्तव में शामिल क्षेत्र का वर्णन करने के लिए परिणाम फसल क्षेत्र को समायोजित करना होगा। सामान्य तौर पर, कैमरे का उपयोग करने वाले एप्लिकेशन को फसल क्षेत्र, छवि सेंसर के आयाम और लेंस फोकल लंबाई के आधार पर प्राप्त होने वाले दृश्य के क्षेत्र को निर्धारित करने में सक्षम होना चाहिए।

चूँकि फसल क्षेत्र सभी धाराओं पर लागू होता है, जिसका पहलू अनुपात फसल क्षेत्र से भिन्न हो सकता है, प्रत्येक धारा के लिए उपयोग किया जाने वाला सटीक सेंसर क्षेत्र फसल क्षेत्र से छोटा हो सकता है। विशेष रूप से, प्रत्येक स्ट्रीम को परिभाषित फसल क्षेत्र को न्यूनतम रूप से आगे काटकर वर्ग पिक्सेल और उसके पहलू अनुपात को बनाए रखना चाहिए। यदि धारा का पहलू अनुपात फसल क्षेत्र से अधिक चौड़ा है, तो धारा को आगे लंबवत रूप से काटा जाना चाहिए, और यदि धारा का पहलू अनुपात फसल क्षेत्र की तुलना में संकीर्ण है, तो धारा को क्षैतिज रूप से आगे काटा जाना चाहिए।

सभी मामलों में, धारा फसल को पूर्ण फसल क्षेत्र के भीतर केंद्रित किया जाना चाहिए, और प्रत्येक धारा को पूर्ण फसल क्षेत्र के सापेक्ष केवल क्षैतिज या ऊर्ध्वाधर रूप से काटा जाता है, कभी भी नहीं।

उदाहरण के लिए, यदि दो स्ट्रीम परिभाषित हैं, एक 640x480 स्ट्रीम (4:3 पहलू), और एक 1280x720 स्ट्रीम (16:9 पहलू), तो नीचे कुछ नमूना फसल क्षेत्रों के लिए प्रत्येक स्ट्रीम के लिए अपेक्षित आउटपुट क्षेत्रों को एक काल्पनिक 3 पर दर्शाया गया है। एमपी (2000 x 1500 पिक्सेल ऐरे) सेंसर।

फसल क्षेत्र: (500, 375, 1000, 750) (4:3 पक्षानुपात)
640x480 धारा फसल: (500, 375, 1000, 750) (फसल क्षेत्र के बराबर)
1280x720 स्ट्रीम क्रॉप: (500, 469, 1000, 562)

फसल-क्षेत्र-43-अनुपात

चित्र 1. 4:3 पक्षानुपात

फसल क्षेत्र: (500, 375, 1333, 750) (16:9 पहलू अनुपात)
640x480 स्ट्रीम क्रॉप: (666, 375, 1000, 750)
1280x720 धारा फसल: (500, 375, 1333, 750) (फसल क्षेत्र के बराबर)

फसल-क्षेत्र-169-अनुपात

चित्र 2. 16:9 पहलू अनुपात

फसल क्षेत्र: (500, 375, 750, 750) (1:1 पहलू अनुपात)
640x480 स्ट्रीम क्रॉप: (500, 469, 750, 562)
1280x720 स्ट्रीम क्रॉप: (500, 543, 750, 414)

फसल-क्षेत्र-11-अनुपात

चित्र 3. 1:1 पक्षानुपात

और एक अंतिम उदाहरण, 480p स्ट्रीम के बजाय 1024x1024 वर्ग पहलू अनुपात स्ट्रीम:
फसल क्षेत्र: (500, 375, 1000, 750) (4:3 पक्षानुपात)
1024x1024 धारा फसल: (625, 375, 750, 750)
1280x720 स्ट्रीम क्रॉप: (500, 469, 1000, 562)

फसल-क्षेत्र-43-वर्ग-अनुपात

चित्र 4. 4:3 पक्षानुपात, वर्ग

पुनर्संसाधन

रॉ बेयर डेटा के लिए पुन: प्रसंस्करण समर्थन द्वारा कच्ची छवि फ़ाइलों के लिए अतिरिक्त समर्थन प्रदान किया जाता है। यह समर्थन कैमरा पाइपलाइन को पहले से कैप्चर किए गए RAW बफर और मेटाडेटा (एक संपूर्ण फ्रेम जो पहले रिकॉर्ड किया गया था) को संसाधित करने की अनुमति देता है, ताकि एक नया रेंडर YUV या JPEG आउटपुट तैयार किया जा सके।

ज़ूम

एंड्रॉइड 11 या उच्चतर चलाने वाले उपकरणों के लिए, एक ऐप ANDROID_CONTROL_ZOOM_RATIO सेटिंग के माध्यम से कैमरे के ज़ूम (डिजिटल और ऑप्टिकल) का उपयोग कर सकता है।

ज़ूम अनुपात को फ़्लोटिंग पॉइंट फ़ैक्टर के रूप में परिभाषित किया गया है। क्रॉप और ज़ूम के लिए ANDROID_SCALER_CROP_REGION का उपयोग करने के बजाय, एक ऐप ज़ूम स्तर को नियंत्रित करने के लिए ANDROID_CONTROL_ZOOM_RATIO का उपयोग कर सकता है, और मूल कैमरा सेंसर से भिन्न पहलू अनुपात प्राप्त करने के लिए क्षैतिज और ऊर्ध्वाधर क्रॉपिंग के लिए ANDROID_SCALER_CROP_REGION उपयोग कर सकता है।

एक मल्टी-कैमरा सिस्टम में अलग-अलग फोकल लंबाई वाले एक से अधिक लेंस हो सकते हैं, और उपयोगकर्ता लेंस के बीच स्विच करके ऑप्टिकल ज़ूम का उपयोग कर सकता है। ANDROID_CONTROL_ZOOM_RATIO का उपयोग करने से नीचे दिए गए परिदृश्यों में लाभ होता है:

  • वाइड लेंस से टेलीफोटो लेंस में ज़ूम करना: एक फ्लोटिंग पॉइंट अनुपात ANDROID_SCALER_CROP_REGION के पूर्णांक मानों की तुलना में बेहतर परिशुद्धता प्रदान करता है।
  • वाइड लेंस से अल्ट्रावाइड लेंस में ज़ूम आउट करना: ANDROID_CONTROL_ZOOM_RATIO ज़ूम-आउट (<1.0f) का समर्थन करता है जबकि ANDROID_SCALER_CROP_REGION नहीं करता है।

उदाहरण के लिए, पिछले अनुभाग में परिभाषित समान काल्पनिक कैमरे का उपयोग करके, विभिन्न ज़ूम अनुपात, फसल क्षेत्र और आउटपुट स्ट्रीम के कई परिदृश्य यहां दिए गए हैं।

ज़ूम अनुपात: 2.0; देखने के मूल क्षेत्र का 1/4
फसल क्षेत्र: (0, 0, 2000, 1500) (4:3 पक्षानुपात)
640x480 धारा फसल: (0, 0, 2000, 1500) (फसल क्षेत्र के बराबर)
1280x720 स्ट्रीम क्रॉप: (0, 187, 2000, 1125)

ज़ूम-अनुपात-2-फसल-43

चित्र 5. 2.0 ज़ूम, 4:3 पक्षानुपात

ज़ूम अनुपात: 2.0; देखने के मूल क्षेत्र का 1/4
फसल क्षेत्र: (0, 187, 2000, 1125) (16:9 पक्षानुपात)
640x480 स्ट्रीम क्रॉप: (250, 187, 1500, 1125) (पिलरबॉक्स्ड)
1280x720 धारा फसल: (0, 187, 2000, 1125) (फसल क्षेत्र के बराबर)

ज़ूम-अनुपात-2-फसल-169

चित्र 6. 2.0 ज़ूम, 16:9 पक्षानुपात

ज़ूम अनुपात: 0.5; देखने के मूल क्षेत्र का 4x (वाइड लेंस से अल्ट्रावाइड लेंस पर स्विच किया गया)
फसल क्षेत्र: (250, 0, 1500, 1500) (1:1 पहलू अनुपात)
640x480 स्ट्रीम क्रॉप: (250, 187, 1500, 1125) (लेटरबॉक्स्ड)
1280x720 स्ट्रीम क्रॉप: (250, 328, 1500, 844) (लेटरबॉक्स्ड)

छवियाँ/ज़ूम-अनुपात-0.5-फसल-11

चित्र 7. 0.5 ज़ूम, 1:1 पहलू अनुपात

जैसा कि ऊपर दिए गए ग्राफ़ से देखा जा सकता है, फसल क्षेत्र की समन्वय प्रणाली प्रभावी ज़ूम के बाद देखने के क्षेत्र में बदल जाती है, और इसे निम्नलिखित आयामों के साथ आयत द्वारा दर्शाया जाता है: ( 0 , 0 , activeArrayWith , activeArrayHeight )। यही बात AE/AWB/AF क्षेत्रों और चेहरों पर भी लागू होती है। यह समन्वय प्रणाली परिवर्तन RAW कैप्चर और इसके संबंधित मेटाडेटा जैसे intrinsicCalibration और lensShadingMap पर लागू नहीं होता है।

उपरोक्त समान काल्पनिक उदाहरण का उपयोग करते हुए, और आउटपुट स्ट्रीम #1 (640x480) को दृश्यदर्शी स्ट्रीम मानते हुए, 2.0x ज़ूम दो तरीकों में से एक में प्राप्त किया जा सकता है:

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (डिफ़ॉल्ट), scaler.cropRegion = (500, 375, 1000, 750)

किसी ऐप के लिए android.control.aeRegions दृश्यदर्शी क्षेत्र के शीर्ष-बाएँ तिमाही में सेट करने के लिए, android.control.aeRegions (0, 0, 1000, 750) पर सेट करें और android.control.zoomRatio को 2.0 पर सेट करें। वैकल्पिक रूप से, ऐप 1.0 के android.control.zoomRatio के लिए android.control.aeRegions (500, 375, 1000, 750) के समतुल्य क्षेत्र पर सेट कर सकता है।