Android 9 में, मल्टी-कैमरा वाले डिवाइसों के लिए एपीआई की सुविधा जोड़ी गई है. इसके लिए, दो या इससे ज़्यादा फ़िज़िकल कैमरा डिवाइसों से मिलकर बना एक नया लॉजिकल कैमरा डिवाइस जोड़ा गया है. ये सभी डिवाइस एक ही दिशा में पॉइंट करते हैं. लॉजिकल कैमरा डिवाइस, किसी ऐप्लिकेशन के लिए एक CameraDevice/CaptureSession के तौर पर दिखता है. इससे, एचएएल में इंटिग्रेट की गई मल्टी-कैमरा सुविधाओं के साथ इंटरैक्ट किया जा सकता है. ऐप्लिकेशन, ज़रूरत पड़ने पर, फ़िज़िकल कैमरा स्ट्रीम, मेटाडेटा, और कंट्रोल को ऐक्सेस और कंट्रोल कर सकते हैं.
पहली इमेज. मल्टी-कैमरा की सुविधा
इस डायग्राम में, अलग-अलग कैमरा आईडी को अलग-अलग रंगों में दिखाया गया है. ऐप्लिकेशन, हर फ़िज़िकल कैमरे से एक साथ रॉ बफ़र स्ट्रीम कर सकता है. अलग-अलग फ़िज़िकल कैमरों के लिए अलग-अलग कंट्रोल सेट किए जा सकते हैं. साथ ही, उनसे अलग-अलग मेटाडेटा भी पाया जा सकता है.
उदाहरण और सोर्स
मल्टी-कैमरा वाले डिवाइसों के लिए, लॉजिकल मल्टी-कैमरा की सुविधा का विज्ञापन दिखाना ज़रूरी है.
कैमरा क्लाइंट, getPhysicalCameraIds() को कॉल करके, उन फ़िज़िकल डिवाइसों के कैमरा आईडी के बारे में क्वेरी कर सकते हैं जिनसे कोई खास
लॉजिकल कैमरा बना है.
इसके बाद, नतीजों के तौर पर मिले आईडी का इस्तेमाल करके, फ़िज़िकल डिवाइसों को अलग-अलग कंट्रोल किया जाता है
के ज़रिए
setPhysicalCameraId().
ऐसे अलग-अलग अनुरोधों से मिले नतीजों के बारे में, पूरे
नतीजे से क्वेरी की जा सकती है. इसके लिए,
getPhysicalCameraResults() को कॉल करें.
अलग-अलग फ़िज़िकल कैमरा अनुरोधों में, सिर्फ़ पैरामीटर का सीमित सबसेट इस्तेमाल किया जा सकता है. काम करने वाले पैरामीटर की सूची पाने के लिए, डेवलपर
getAvailablePhysicalCameraRequestKeys() को कॉल कर सकते हैं.
फ़िज़िकल कैमरा स्ट्रीम की सुविधा, सिर्फ़ उन अनुरोधों के लिए उपलब्ध है जिनमें रीप्रोसेसिंग की ज़रूरत नहीं होती. साथ ही, यह सुविधा सिर्फ़ मोनोक्रोम और बेयर सेंसर के लिए उपलब्ध है.
लागू करना
सुविधा की उपलब्धता की जांच करने वाली चेकलिस्ट
एचएएल की ओर, लॉजिकल मल्टी-कैमरा वाले डिवाइस जोड़ने के लिए:
- दो या इससे ज़्यादा फ़िज़िकल
कैमरों से मिलकर बने किसी भी लॉजिकल कैमरा डिवाइस के लिए,
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAकी सुविधा जोड़ें. ये कैमरे, किसी ऐप्लिकेशन के लिए भी उपलब्ध होने चाहिए. - स्टैटिक
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSमेटाडेटा फ़ील्ड में, फ़िज़िकल कैमरा आईडी की सूची भरें. - फ़िज़िकल कैमरा स्ट्रीम के पिक्सल के बीच संबंध दिखाने के लिए, गहराई से जुड़े स्टैटिक मेटाडेटा फ़ील्ड भरें:
ANDROID_LENS_POSE_ROTATION,ANDROID_LENS_POSE_TRANSLATION,ANDROID_LENS_INTRINSIC_CALIBRATION,ANDROID_LENS_DISTORTION,ANDROID_LENS_POSE_REFERENCE. स्टैटिक
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEमेटाडेटा फ़ील्ड को इस पर सेट करें:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: मेन-मेन मोड में मौजूद सेंसर के लिए, हार्डवेयर शटर/एक्सपोज़र सिंक की सुविधा उपलब्ध नहीं है.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: मेन-सेकंडरी मोड में मौजूद सेंसर के लिए, हार्डवेयर शटर/एक्सपोज़र सिंक की सुविधा उपलब्ध है.
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSमें, अलग-अलग फ़िज़िकल कैमरों के लिए काम करने वाले पैरामीटर की सूची भरें. अगर लॉजिकल डिवाइस, अलग-अलग अनुरोधों के साथ काम नहीं करता है, तो सूची खाली हो सकती है.अगर अलग-अलग अनुरोधों के साथ काम करने की सुविधा उपलब्ध है, तो कैप्चर के अनुरोधों के साथ आने वाले
physicalCameraSettingsको प्रोसेस करें और लागू करें. साथ ही, इसके मुताबिक, अलग-अलगphysicalCameraMetadataजोड़ें.Camera HAL डिवाइस के वर्शन 3.5 (Android 10 में लॉन्च किया गया) या इसके बाद के वर्शन के लिए,
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDनतीजे की कुंजी में, लॉजिकल कैमरे के साथ काम करने वाले मौजूदा सक्रिय फ़िज़िकल कैमरे का आईडी भरें.
Android 9 पर काम करने वाले डिवाइसों के लिए, कैमरा डिवाइसों में, एक लॉजिकल YUV या रॉ स्ट्रीम को, एक ही साइज़ (रॉ स्ट्रीम पर लागू नहीं) और फ़ॉर्मैट वाली दो फ़िज़िकल स्ट्रीम से बदलने की सुविधा होनी चाहिए. ये स्ट्रीम, दो अलग-अलग फ़िज़िकल कैमरों से होनी चाहिए. यह सुविधा, Android 10 पर काम करने वाले डिवाइसों के लिए उपलब्ध नहीं है.
Android 10 पर काम करने वाले डिवाइसों के लिए, कैमरा HAL डिवाइस का वर्शन
3.5
या इसके बाद का होना चाहिए. साथ ही, कैमरा डिवाइस में
isStreamCombinationSupported
की सुविधा होनी चाहिए. इससे ऐप्लिकेशन यह क्वेरी कर सकते हैं कि फ़िज़िकल स्ट्रीम वाला कोई खास स्ट्रीम कॉम्बिनेशन काम करता है या नहीं.
स्ट्रीम कॉन्फ़िगरेशन मैप
लॉजिकल कैमरे के लिए, किसी खास हार्डवेयर लेवल के कैमरा डिवाइस के लिए ज़रूरी स्ट्रीम कॉम्बिनेशन,
में ज़रूरी स्ट्रीम कॉम्बिनेशन के बराबर होते हैं.
CameraDevice.createCaptureSession
स्ट्रीम कॉन्फ़िगरेशन मैप में मौजूद सभी स्ट्रीम, लॉजिकल स्ट्रीम होनी चाहिए.
अगर किसी लॉजिकल कैमरा डिवाइस में RAW केपबिलिटी उपलब्ध है और उसके फ़िज़िकल सब-कैमरे अलग-अलग साइज़ के हैं, तो किसी ऐप्लिकेशन के लॉजिकल RAW स्ट्रीम को कॉन्फ़िगर करने पर, लॉजिकल कैमरा डिवाइस को अलग-अलग सेंसर साइज़ वाले फ़िज़िकल सब-कैमरों पर स्विच नहीं करना चाहिए. इससे यह पक्का होता है कि रॉ फ़ॉर्मैट में फ़ोटो लेने वाले मौजूदा ऐप्लिकेशन काम करते रहें.
रॉ फ़ॉर्मैट में फ़ोटो लेते समय, फ़िज़िकल सब-कैमरों के बीच स्विच करके, एचएएल में लागू किए गए ऑप्टिकल ज़ूम की सुविधा का फ़ायदा पाने के लिए, ऐप्लिकेशन को लॉजिकल रॉ स्ट्रीम के बजाय, फ़िज़िकल सब-कैमरा स्ट्रीम कॉन्फ़िगर करनी होंगी.
स्ट्रीम कॉम्बिनेशन की गारंटी
लॉजिकल कैमरा डिवाइस को, उसके हार्डवेयर लेवल और सुविधाओं के आधार पर, फ़िज़िकल कैमरा डिवाइस की तरह काम करना चाहिए. हमारा सुझाव है कि इसकी सुविधाओं का सेट, अलग-अलग फ़िज़िकल कैमरों की सुविधाओं के सेट से बड़ा हो.
Android 9 पर काम करने वाले डिवाइसों के लिए, हर गारंटीड स्ट्रीम कॉम्बिनेशन के लिए, लॉजिकल कैमरे में ये सुविधाएं होनी चाहिए:
एक लॉजिकल YUV_420_888 या रॉ स्ट्रीम को, एक ही साइज़ और फ़ॉर्मैट वाली दो फ़िज़िकल स्ट्रीम से बदलने की सुविधा. ये स्ट्रीम, दो अलग-अलग फ़िज़िकल कैमरों से होनी चाहिए. इसके लिए ज़रूरी है कि फ़िज़िकल कैमरे, साइज़ और फ़ॉर्मैट के साथ काम करते हों.
दो रॉ स्ट्रीम जोड़ने की सुविधा. इनमें से एक स्ट्रीम, हर फ़िज़िकल कैमरे से होनी चाहिए. यह सुविधा तब काम करती है, जब लॉजिकल कैमरा, रॉ फ़ॉर्मैट में फ़ोटो लेने की सुविधा का विज्ञापन नहीं दिखाता, लेकिन उसके साथ काम करने वाले फ़िज़िकल कैमरे दिखाते हैं. ऐसा आम तौर पर तब होता है, जब फ़िज़िकल कैमरों के सेंसर साइज़ अलग-अलग होते हैं.
एक ही साइज़ और फ़ॉर्मैट वाली लॉजिकल स्ट्रीम के बजाय, फ़िज़िकल स्ट्रीम का इस्तेमाल करने की सुविधा. ऐसा करने पर, कैप्चर के फ़्रेम रेट में कमी नहीं आनी चाहिए. इसके लिए ज़रूरी है कि फ़िज़िकल और लॉजिकल स्ट्रीम के फ़्रेम की कम से कम अवधि एक जैसी हो.
परफ़ॉर्मेंस और पावर से जुड़ी ज़रूरी बातें
परफ़ॉर्मेंस:
- संसाधनों की कमी की वजह से, फ़िज़िकल स्ट्रीम को कॉन्फ़िगर और स्ट्रीम करने पर, लॉजिकल कैमरे के कैप्चर रेट में कमी आ सकती है.
- फ़िज़िकल कैमरा सेटिंग लागू करने पर, कैप्चर रेट में कमी आ सकती है. ऐसा तब होता है, जब साथ काम करने वाले कैमरे अलग-अलग फ़्रेम रेट पर सेट हों.
पावर:
- डिफ़ॉल्ट तौर पर, एचएएल का पावर ऑप्टिमाइज़ेशन काम करता रहता है.
- फ़िज़िकल स्ट्रीम को कॉन्फ़िगर करने या उनका अनुरोध करने पर, एचएएल का इंटरनल पावर ऑप्टिमाइज़ेशन बंद हो सकता है. साथ ही, ज़्यादा पावर का इस्तेमाल हो सकता है.
पसंद के मुताबिक बनाएं
अपने डिवाइस के सेटअप को इन तरीकों से पसंद के मुताबिक बनाया जा सकता है.
- लॉजिकल कैमरा डिवाइस का फ़्यूज़्ड आउटपुट, पूरी तरह से एचएएल के सेटअप पर निर्भर करता है. फ़िज़िकल कैमरों से, फ़्यूज़्ड लॉजिकल स्ट्रीम कैसे ली जाती हैं, यह जानकारी ऐप्लिकेशन और Android कैमरा फ़्रेमवर्क के लिए उपलब्ध नहीं होती.
- अलग-अलग फ़िज़िकल अनुरोधों और नतीजों के लिए, सुविधा की उपलब्धता को ज़रूरत के हिसाब से सेट किया जा सकता है. ऐसे अनुरोधों में उपलब्ध पैरामीटर का सेट भी, पूरी तरह से एचएएल के खास सेटअप पर निर्भर करता है.
- Android 10 से, एचएएल,
उन कैमरों की संख्या कम कर सकता है जिन्हें कोई ऐप्लिकेशन सीधे तौर पर खोल सकता है. ऐसा वह
`getCameraIdList` में कुछ या सभी PHYSICAL_IDs का विज्ञापन न दिखाकर कर सकता है.
getCameraIdListइसके बाद,getPhysicalCameraCharacteristicsको कॉल करने पर, फ़िज़िकल कैमरे की खासियतें दिखनी चाहिए.
सत्यापन
लॉजिकल मल्टी-कैमरा वाले डिवाइसों को, कैमरा सीटीएस पास करना होगा. यह टेस्ट, किसी भी सामान्य कैमरे के लिए ज़रूरी है.
इस तरह के डिवाइस को टारगेट करने वाले टेस्ट केस,
LogicalCameraDeviceTest
मॉड्यूल में देखे जा सकते हैं.
ये तीन आईटीएस टेस्ट, मल्टी-कैमरा सिस्टम को टारगेट करते हैं, ताकि इमेज को सही तरीके से फ़्यूज़ किया जा सके:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
सीन 1 और सीन 4 के टेस्ट,
आईटीएस-इन-अ-बॉक्स टेस्ट
रिग के साथ रन होते हैं. test_multi_camera_match टेस्ट से यह पक्का होता है कि दोनों कैमरे चालू होने पर, इमेज के बीच की रोशनी एक जैसी हो. test_multi_camera_alignment टेस्ट से यह पक्का होता है कि कैमरे के बीच की दूरी, ओरिएंटेशन, और डिस्टॉर्शन पैरामीटर सही तरीके से लोड हों. अगर मल्टी-कैमरा सिस्टम में वाइड फ़ील्ड ऑफ़ व्यू (FoV) वाला कैमरा (>90o) शामिल है, तो आईटीएस बॉक्स का rev2 वर्शन ज़रूरी है.
Sensor_fusion एक दूसरा टेस्ट रिग है. इससे फ़ोन को बार-बार, तय किए गए तरीके से घुमाया जा सकता है. साथ ही, इससे यह पक्का होता है कि जायरोस्कोप और इमेज सेंसर के टाइमस्टैंप मैच करें और मल्टी-कैमरा फ़्रेम सिंक में हों.
सभी बॉक्स, AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) और MYWAY Manufacturing (www.myway.tw, sales@myway.tw) से खरीदे जा सकते हैं. इसके अलावा, rev1 आईटीएस बॉक्स, West-Mark (www.west-mark.com, dgoodman@west-mark.com) से खरीदा जा सकता है.
सबसे सही तरीके
ऐप्लिकेशन की कंपैटिबिलिटी बनाए रखते हुए, मल्टी-कैमरा की सुविधाओं का पूरा फ़ायदा पाने के लिए, लॉजिकल मल्टी-कैमरा डिवाइस को लागू करते समय, यहां दिए गए सबसे सही तरीके अपनाएं:
- (Android 10 या इसके बाद के वर्शन) फ़िज़िकल सब-कैमरों को
getCameraIdListसे छिपाएं. इससे, उन कैमरों की संख्या कम हो जाती है जिन्हें ऐप्लिकेशन सीधे तौर पर खोल सकते हैं. साथ ही, ऐप्लिकेशन के लिए, कैमरा चुनने की जटिल लॉजिक की ज़रूरत नहीं होती. - (Android 11 या इसके बाद के वर्शन) ऑप्टिकल ज़ूम की सुविधा वाले लॉजिकल मल्टी-कैमरा
डिवाइस के लिए,
ANDROID_CONTROL_ZOOM_RATIOएपीआई लागू करें. साथ ही, आसपेक्ट रेशियो क्रॉप करने के लिए, सिर्फ़ANDROID_SCALER_CROP_REGIONका इस्तेमाल करें.ANDROID_CONTROL_ZOOM_RATIOकी मदद से, डिवाइस को ज़ूम आउट किया जा सकता है और बेहतर सटीक नतीजे पाए जा सकते हैं. इस मामले में, एचएएल कोANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLES, औरANDROID_STATISTICS_FACE_LANDMARKSके कोऑर्डिनेट सिस्टम को अडजस्ट करना होगा, ताकि ज़ूम करने के बाद, फ़ील्ड ऑफ़ व्यू को सेंसर ऐक्टिव कलेक्शन के तौर पर माना जा सके.ANDROID_SCALER_CROP_REGIONकैसे काम करता है, इस बारे में ज़्यादा जानने के लिए,ANDROID_CONTROL_ZOOM_RATIO, देखेंcamera3_crop_reprocess#cropping. - अलग-अलग सुविधाओं वाले फ़िज़िकल कैमरों वाले मल्टी-कैमरा डिवाइसों के लिए, पक्का करें कि डिवाइस, किसी कंट्रोल के लिए किसी खास वैल्यू या रेंज के साथ काम करने की सुविधा का विज्ञापन सिर्फ़ तब दिखाए, जब पूरी ज़ूम रेंज, वैल्यू या रेंज के साथ काम करती हो. उदाहरण के लिए, अगर लॉजिकल कैमरा, अल्ट्रावाइड, वाइड, और टेलीफ़ोटो कैमरे से मिलकर बना है, तो यह तरीका अपनाएं:
- अगर फ़िज़िकल कैमरों के ऐक्टिव कलेक्शन के साइज़ अलग-अलग हैं, तो
कैमरा एचएएल को फ़िज़िकल कैमरों के ऐक्टिव कलेक्शन से
लॉजिकल कैमरे के ऐक्टिव कलेक्शन तक मैपिंग करनी होगी. यह मैपिंग
ANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLES, औरANDROID_STATISTICS_FACE_LANDMARKSके लिए की जाएगी. इससे, ऐप्लिकेशन के नज़रिए से, कोऑर्डिनेट सिस्टम, लॉजिकल कैमरे के ऐक्टिव कलेक्शन का साइज़ होगा. - अगर वाइड और टेलीफ़ोटो कैमरे, ऑटोफ़ोकस की सुविधा के साथ काम करते हैं, लेकिन अल्ट्रावाइड कैमरा फ़िक्स्ड फ़ोकस वाला है, तो पक्का करें कि लॉजिकल कैमरा, ऑटोफ़ोकस की सुविधा के साथ काम करने का विज्ञापन दिखाए. एचएएल को अल्ट्रावाइड कैमरे के लिए, ऑटोफ़ोकस स्टेट मशीन को सिम्युलेट करना होगा, ताकि जब ऐप्लिकेशन, अल्ट्रावाइड लेंस पर ज़ूम आउट करे, तो ऐप्लिकेशन को यह जानकारी न मिले कि साथ काम करने वाला फ़िज़िकल कैमरा फ़िक्स्ड फ़ोकस वाला है. साथ ही, काम करने वाले एएफ़ मोड के लिए, ऑटोफ़ोकस स्टेट मशीन उम्मीद के मुताबिक काम करें.
- अगर वाइड और टेलीफ़ोटो कैमरे, 4K @ 60 एफ़पीएस पर काम करते हैं और अल्ट्रावाइड कैमरा सिर्फ़ 4K @ 30 एफ़पीएस या 1080 पिक्सल @ 60 एफ़पीएस पर काम करता है, लेकिन 4K @ 60 एफ़पीएस पर काम नहीं करता, तो पक्का करें कि लॉजिकल कैमरा, काम करने वाले स्ट्रीम कॉन्फ़िगरेशन में 4k @ 60 एफ़पीएस का विज्ञापन न दिखाए. इससे लॉजिकल कैमरे की सुविधाओं की इंटिग्रिटी की गारंटी मिलती है. साथ ही, यह पक्का होता है कि ऐप्लिकेशन को 4k @ 60 एफ़पीएस की सुविधा न मिलने की समस्या का सामना न करना पड़े.
ANDROID_CONTROL_ZOOM_RATIO
- अगर फ़िज़िकल कैमरों के ऐक्टिव कलेक्शन के साइज़ अलग-अलग हैं, तो
कैमरा एचएएल को फ़िज़िकल कैमरों के ऐक्टिव कलेक्शन से
लॉजिकल कैमरे के ऐक्टिव कलेक्शन तक मैपिंग करनी होगी. यह मैपिंग
- Android 10 और इसके बाद के वर्शन में, लॉजिकल मल्टी-कैमरा के लिए, फ़िज़िकल स्ट्रीम वाले स्ट्रीम कॉम्बिनेशन के साथ काम करना ज़रूरी नहीं है.
अगर एचएएल, फ़िज़िकल स्ट्रीम वाले कॉम्बिनेशन के साथ काम करता है, तो:
- (Android 11 या इसके बाद के वर्शन) स्टीरियो से गहराई और मोशन ट्रैकिंग जैसे इस्तेमाल के उदाहरणों को बेहतर तरीके से हैंडल करने के लिए, फ़िज़िकल स्ट्रीम आउटपुट के फ़ील्ड ऑफ़ व्यू को जितना हो सके उतना बड़ा बनाएं. हालांकि, अगर कोई फ़िज़िकल स्ट्रीम और लॉजिकल स्ट्रीम, एक ही फ़िज़िकल कैमरे से ली जाती है, तो हार्डवेयर की सीमाओं की वजह से, फ़िज़िकल स्ट्रीम का फ़ील्ड ऑफ़ व्यू, लॉजिकल स्ट्रीम के फ़ील्ड ऑफ़ व्यू के बराबर हो सकता है.
- कई फ़िज़िकल स्ट्रीम की वजह से होने वाले मेमोरी प्रेशर को कम करने के लिए,
पक्का करें कि ऐप्लिकेशन, खाली बफ़र को डीएलोकेट करने के लिए
discardFreeBuffersका इस्तेमाल करें. ये बफ़र, उपभोक्ता की ओर से रिलीज़ किए जाते हैं, लेकिन अब तक प्रोड्यूसर की ओर से डीक्यू नहीं किए गए हैं. ऐसा तब किया जाता है, जब किसी फ़िज़िकल स्ट्रीम के कुछ समय के लिए इस्तेमाल न होने की संभावना हो. - अगर अलग-अलग फ़िज़िकल कैमरों से ली गई फ़िज़िकल स्ट्रीम, आम तौर पर एक ही अनुरोध से अटैच नहीं होती हैं, तो पक्का करें कि ऐप्लिकेशन,
surface groupका इस्तेमाल करें. इससे, दो ऐप्लिकेशन-फ़ेसिंग सर्फ़ेस को बैक अप करने के लिए, एक बफ़र क्यू का इस्तेमाल किया जाता है. इससे मेमोरी की खपत कम होती है.