اندروید 9 پشتیبانی API را برای دستگاههای چند دوربینه از طریق یک دوربین منطقی جدید متشکل از دو یا چند دستگاه دوربین فیزیکی که در یک جهت قرار دارند، معرفی کرد. دستگاه دوربین منطقی بهعنوان یک CameraDevice/CaptureSession در معرض برنامهای قرار میگیرد که امکان تعامل با ویژگیهای چند دوربین یکپارچه HAL را فراهم میکند. برنامهها میتوانند بهصورت اختیاری به جریانهای فیزیکی دوربین فیزیکی، فرادادهها و کنترلها دسترسی داشته باشند و آنها را کنترل کنند.
شکل 1 . پشتیبانی از چند دوربین
در این نمودار، شناسه های مختلف دوربین دارای کد رنگی هستند. این برنامه می تواند بافرهای خام را از هر دوربین فیزیکی به طور همزمان پخش کند. همچنین امکان تنظیم کنترل های جداگانه و دریافت ابرداده جداگانه از دوربین های فیزیکی مختلف وجود دارد.
مصادیق و منابع
دستگاه های چند دوربینی باید با قابلیت منطقی چند دوربین تبلیغ شوند.
کلاینتهای دوربین میتوانند با فراخوانی getPhysicalCameraIds()
شناسه دوربین دستگاههای فیزیکی را که یک دوربین منطقی خاص از آن ساخته شده است، استعلام کنند. شناسه هایی که به عنوان بخشی از نتیجه برگردانده می شوند، سپس برای کنترل دستگاه های فیزیکی به صورت جداگانه از طریق setPhysicalCameraId()
استفاده می شوند. نتایج چنین درخواست های فردی را می توان با فراخوانی getPhysicalCameraResults()
از نتیجه کامل جستجو کرد.
درخواستهای دوربین فیزیکی فردی ممکن است فقط از یک زیر مجموعه محدود از پارامترها پشتیبانی کند. برای دریافت لیستی از پارامترهای پشتیبانی شده، توسعه دهندگان می توانند getAvailablePhysicalCameraRequestKeys()
فراخوانی کنند.
جریانهای دوربین فیزیکی فقط برای درخواستهای غیر پردازش مجدد و فقط برای حسگرهای تک رنگ و بایر پشتیبانی میشوند.
پیاده سازی
چک لیست پشتیبانی
برای افزودن دستگاههای چند دوربینی منطقی در سمت HAL:
- یک قابلیت
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/RAW با جریانهای فیزیکی هماندازه (برای جریانهای RAW اعمال نمیشود) و فرمت یکسان دو دوربین فیزیکی پشتیبانی کنند. این برای دستگاههای دارای Android 10 اعمال نمیشود.
برای دستگاههایی که Android 10 دارند و نسخه دستگاه HAL دوربین 3.5 یا بالاتر است، دستگاه دوربین باید از isStreamCombinationSupported
پشتیبانی کند تا برنامهها پرس و جو کنند که آیا ترکیب پخش جریانی خاصی حاوی جریانهای فیزیکی پشتیبانی میشود یا خیر.
نقشه پیکربندی جریان
برای یک دوربین منطقی، ترکیبهای پخش جریانی اجباری برای دستگاه دوربین با یک سطح سختافزاری خاص، همان چیزی است که در CameraDevice.createCaptureSession
مورد نیاز است. همه جریانهای موجود در نقشه پیکربندی جریان باید جریانهای منطقی باشند.
برای یک دستگاه دوربین منطقی که از قابلیت RAW با دوربینهای فرعی فیزیکی با اندازههای مختلف پشتیبانی میکند، اگر برنامهای یک جریان RAW منطقی را پیکربندی کند، دستگاه دوربین منطقی نباید به دوربینهای فرعی فیزیکی با اندازههای حسگر متفاوت سوئیچ کند. این تضمین می کند که برنامه های ضبط RAW موجود خراب نمی شوند.
برای استفاده از زوم اپتیکال پیادهسازی شده با HAL با جابهجایی بین دوربینهای فرعی فیزیکی در حین ضبط RAW، برنامهها باید جریانهای فیزیکی زیردوربین را به جای جریان منطقی RAW پیکربندی کنند.
ترکیب جریان تضمینی
هم دوربین منطقی و هم دوربین های فیزیکی زیربنایی آن باید ترکیبات جریان اجباری مورد نیاز برای سطوح دستگاه خود را تضمین کنند.
یک دستگاه دوربین منطقی باید بر اساس سطح سخت افزاری و قابلیت هایش مانند یک دستگاه دوربین فیزیکی عمل کند. توصیه میشود که مجموعه ویژگیهای آن یک ابر مجموعه از دوربینهای فیزیکی فردی باشد.
در دستگاههای دارای Android 9، برای هر ترکیب پخش تضمینی، دوربین منطقی باید از موارد زیر پشتیبانی کند:
جایگزینی یک جریان منطقی YUV_420_888 یا خام با دو جریان فیزیکی با اندازه و فرمت یکسان، هر کدام از یک دوربین فیزیکی جداگانه، با توجه به اینکه اندازه و فرمت توسط دوربینهای فیزیکی پشتیبانی میشود.
اضافه کردن دو جریان خام، یکی از هر دوربین فیزیکی، اگر دوربین منطقی قابلیت RAW را تبلیغ نمیکند، اما دوربینهای فیزیکی زیربنایی این کار را میکنند. این معمولاً زمانی اتفاق میافتد که دوربینهای فیزیکی اندازههای سنسور متفاوتی داشته باشند.
استفاده از جریان های فیزیکی به جای یک جریان منطقی با همان اندازه و فرمت. وقتی حداقل مدت زمان فریم جریان های فیزیکی و منطقی یکسان است، این نباید سرعت فریم گرفتن را کاهش دهد.
ملاحظات عملکرد و قدرت
عملکرد:
- پیکربندی و پخش جریانهای فیزیکی ممکن است به دلیل محدودیت منابع، سرعت ضبط دوربین منطقی را کاهش دهد.
- اگر دوربینهای زیرین در نرخهای فریم متفاوت قرار بگیرند، اعمال تنظیمات فیزیکی دوربین ممکن است سرعت عکسبرداری را کاهش دهد.
قدرت:
- بهینه سازی توان HAL در حالت پیش فرض به کار خود ادامه می دهد.
- پیکربندی یا درخواست جریان های فیزیکی ممکن است بهینه سازی توان داخلی HAL را لغو کند و مصرف انرژی بیشتری را به همراه داشته باشد.
سفارشی سازی
می توانید پیاده سازی دستگاه خود را به روش های زیر سفارشی کنید.
- خروجی ذوب شده دستگاه دوربین منطقی کاملاً به اجرای HAL بستگی دارد. تصمیم در مورد چگونگی ترکیب جریان های منطقی از دوربین های فیزیکی برای برنامه و چارچوب دوربین اندروید شفاف است.
- درخواست ها و نتایج فیزیکی فردی را می توان به صورت اختیاری پشتیبانی کرد. مجموعه پارامترهای موجود در چنین درخواست هایی نیز کاملاً به پیاده سازی HAL خاص بستگی دارد.
- از Android 10، HAL میتواند تعداد دوربینهایی را که میتوانند مستقیماً توسط یک برنامه باز شوند، با انتخاب عدم تبلیغ برخی یا همه PHYSICAL_ID در
getCameraIdList
کاهش دهد. سپس فراخوانیgetPhysicalCameraCharacteristics
باید ویژگی های دوربین فیزیکی را بازگرداند.
اعتبار سنجی
دستگاه های منطقی چند دوربینی باید مانند هر دوربین معمولی دیگری از CTS دوربین عبور کنند. موارد آزمایشی که این نوع دستگاه را هدف قرار می دهند را می توان در ماژول LogicalCameraDeviceTest
یافت.
این سه تست ITS سیستم های چند دوربینی را هدف قرار می دهند تا ترکیب مناسب تصاویر را تسهیل کنند:
-
scene1/test_multi_camera_match.py
-
scene4/test_multi_camera_alignment.py
-
sensor_fusion/test_multi_camera_frame_sync.py
آزمایش صحنه 1 و صحنه 4 با دستگاه تست ITS-in-a-box اجرا می شود. تست test_multi_camera_match
بیان می کند که روشنایی مرکز تصاویر زمانی که دو دوربین هر دو فعال هستند مطابقت دارد. تست test_multi_camera_alignment
بیان می کند که فاصله ها، جهت گیری ها و پارامترهای اعوجاج دوربین به درستی بارگذاری شده اند. اگر سیستم چند دوربینی شامل دوربین Wide FoV (>90o) باشد، نسخه rev2 جعبه ITS مورد نیاز است.
Sensor_fusion
دومین دستگاه آزمایشی است که حرکت مکرر و تجویز شده تلفن را فعال میکند و ادعا میکند که مهرهای زمانی ژیروسکوپ و سنسور تصویر مطابقت دارند و فریمهای چند دوربین همگام هستند.
همه جعبهها از طریق AcuSpec, Inc. ( www.acuspecinc.com ، fred@acuspecinc.com) و MYWAY Manufacturing ( www.myway.tw ، sales@myway.tw) در دسترس هستند. علاوه بر این، جعبه rev1 ITS را می توان از طریق West-Mark ( www.west-mark.com ، dgoodman@west-mark.com) خریداری کرد.
بهترین شیوه ها
برای استفاده کامل از ویژگیهای فعال شده توسط چند دوربین و در عین حال سازگاری با برنامه، این بهترین روشها را هنگام پیادهسازی یک دستگاه چند دوربینه منطقی دنبال کنید:
- (اندروید 10 یا بالاتر) دوربین های فرعی فیزیکی را از
getCameraIdList
پنهان کنید. این باعث کاهش تعداد دوربین هایی می شود که می توانند مستقیماً توسط برنامه ها باز شوند و نیازی به برنامه ها برای داشتن منطق پیچیده انتخاب دوربین را از بین می برد. - (Android 11 یا بالاتر) برای یک دستگاه منطقی با چند دوربین که از زوم اپتیکال پشتیبانی می کند، API
ANDROID_CONTROL_ZOOM_RATIO
را اجرا کنید و فقط برای برش نسبت تصویرANDROID_SCALER_CROP_REGION
استفاده کنید.ANDROID_CONTROL_ZOOM_RATIO
دستگاه را قادر میسازد کوچکنمایی کند و دقت بهتری را حفظ کند. در این مورد، HAL باید سیستم مختصاتANDROID_SCALER_CROP_REGION
،ANDROID_CONTROL_AE_REGIONS
،ANDROID_CONTROL_AWB_REGIONS
،ANDROID_CONTROL_AF_REGIONS
، ANDROID_STATISTICS_REGIONS، وANDROID_STATISTICS_FACE_RECTANGLES
را تنظیم کند.ANDROID_STATISTICS_FACE_LANDMARKS
تا میدان دید پس از زوم را به عنوان آرایه فعال حسگر در نظر بگیرید. برای اطلاعات بیشتر در مورد نحوه عملکردANDROID_SCALER_CROP_REGION
همراه باANDROID_CONTROL_ZOOM_RATIO
، بهcamera3_crop_reprocess#cropping
مراجعه کنید. - برای دستگاههای چند دوربینی با دوربینهای فیزیکی که قابلیتهای متفاوتی دارند، مطمئن شوید که دستگاه فقط در صورتی که کل محدوده بزرگنمایی از مقدار یا محدوده پشتیبانی میکند، از مقدار یا محدوده خاصی برای کنترل پشتیبانی میکند. به عنوان مثال، اگر دوربین منطقی از یک دوربین فوق عریض، یک دوربین عریض و یک دوربین تله فوتو تشکیل شده است، موارد زیر را انجام دهید:
- اگر اندازههای آرایه فعال دوربینهای فیزیکی متفاوت است، دوربین HAL باید نقشهبرداری را از آرایههای فعال دوربینهای فیزیکی به آرایه فعال دوربین منطقی برای
ANDROID_SCALER_CROP_REGION
،ANDROID_CONTROL_AE_REGIONS
،ANDROID_CONTROL_AWB_REGIONS
ANDROID_CONTROL_AF_REGIONS
انجام دهد.ANDROID_STATISTICS_FACE_RECTANGLES
وANDROID_STATISTICS_FACE_LANDMARKS
به طوری که از منظر برنامه، سیستم مختصات اندازه آرایه فعال دوربین منطقی است. - اگر دوربین های عریض و تله فوتو از فوکوس خودکار پشتیبانی می کنند، اما دوربین فوق عریض فوکوس ثابت است، مطمئن شوید که دوربین منطقی پشتیبانی از فوکوس خودکار را تبلیغ می کند. HAL باید یک ماشین حالت فوکوس خودکار را برای دوربین فوق عریض شبیهسازی کند، به طوری که وقتی برنامه به لنز فوق عریض بزرگنمایی میکند، این واقعیت که دوربین فیزیکی زیربنایی فوکوس ثابت است برای برنامه شفاف باشد و ماشینهای حالت فوکوس خودکار برای حالتهای AF پشتیبانیشده شفاف باشد. همانطور که انتظار می رود کار کنید
- اگر دوربین های عریض و تله فوتو از 4K @ 60 فریم بر ثانیه پشتیبانی می کنند، و دوربین اولتراواید فقط از 4K @ 30 fps یا 1080p @ 60 fps پشتیبانی می کند، اما نه از 4K @ 60 fps، مطمئن شوید که دوربین منطقی 4k @ 60 fps را تبلیغ نمی کند. تنظیمات جریان پشتیبانی شده آن این یکپارچگی قابلیتهای دوربین منطقی را تضمین میکند و تضمین میکند که برنامه با مشکل عدم دستیابی به 4k @ 60 فریم در ثانیه در مقدار
ANDROID_CONTROL_ZOOM_RATIO
کمتر از 1 مواجه نمیشود.
- اگر اندازههای آرایه فعال دوربینهای فیزیکی متفاوت است، دوربین HAL باید نقشهبرداری را از آرایههای فعال دوربینهای فیزیکی به آرایه فعال دوربین منطقی برای
- با توجه به اندروید 10، برای پشتیبانی از ترکیبهای جریانی که شامل جریانهای فیزیکی هستند، به یک دوربین چندگانه منطقی نیازی نیست. اگر HAL از ترکیبی با جریان های فیزیکی پشتیبانی می کند:
- (اندروید 11 یا بالاتر) برای مدیریت بهتر موارد استفاده از قبیل عمق استریو و ردیابی حرکت، میدان دید خروجیهای جریان فیزیکی را تا جایی که سختافزار میتواند به دست آورد بزرگ کنید. با این حال، اگر یک جریان فیزیکی و یک جریان منطقی از یک دوربین فیزیکی نشات میگیرد، محدودیتهای سختافزاری ممکن است باعث شود که میدان دید جریان فیزیکی با جریان منطقی یکسان باشد.
- برای رسیدگی به فشار حافظه ناشی از چندین جریان فیزیکی، مطمئن شوید که برنامهها از
discardFreeBuffers
استفاده میکنند تا بافرهای رایگان (بافرهایی که توسط مصرفکننده منتشر میشوند، اما هنوز توسط تولیدکننده حذف نشدهاند) استفاده میکنند، اگر انتظار میرود یک جریان فیزیکی برای مدتی بیحرکت باشد. از زمان - اگر جریانهای فیزیکی از دوربینهای فیزیکی مختلف معمولاً به یک درخواست متصل نمیشوند، مطمئن شوید که برنامهها
surface group
استفاده میکنند تا از یک صف بافر برای پشتیبانگیری دو سطح رو به برنامه استفاده شود و مصرف حافظه کاهش یابد.