Android 9 ได้เปิดตัวการรองรับ API สำหรับอุปกรณ์ที่มีกล้องหลายตัวผ่านอุปกรณ์กล้องตรรกะใหม่ที่ประกอบด้วยอุปกรณ์กล้องจริง 2 ตัวขึ้นไปซึ่งหันไปในทิศทางเดียวกัน อุปกรณ์กล้องตรรกะจะแสดงเป็น CameraDevice/CaptureSession เดียวให้กับแอป ซึ่งช่วยให้โต้ตอบกับฟีเจอร์กล้องหลายตัวที่ผสานรวมกับ HAL ได้ แอปสามารถเลือกเข้าถึงและควบคุมสตรีมกล้องจริง ข้อมูลเมตา และการควบคุมที่เกี่ยวข้องได้
รูปที่ 1 รองรับกล้องหลายตัว
ในแผนภาพนี้ รหัสกล้องต่างๆ จะมีการกำหนดสี แอปสามารถสตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวได้พร้อมกัน นอกจากนี้ยังสามารถตั้งค่าการควบคุมแยกกันและรับข้อมูลเมตาแยกกันจากกล้องจริงต่างๆ ได้ด้วย
ตัวอย่างและแหล่งที่มา
อุปกรณ์ที่มีกล้องหลายตัวต้องมีการประกาศความสามารถของกล้องหลายตัวแบบตรรกะด้วย ตรรกะ
ไคลเอ็นต์กล้องสามารถค้นหารหัสกล้องของอุปกรณ์จริงที่กล้องตรรกะเฉพาะประกอบด้วยได้โดยเรียกใช้
getPhysicalCameraIds()
จากนั้นจะใช้รหัสที่แสดงผลเป็นส่วนหนึ่งของผลลัพธ์เพื่อควบคุมอุปกรณ์จริงแต่ละรายการผ่าน
แต่ละรายการผ่าน
setPhysicalCameraId()
และสามารถค้นหาผลลัพธ์จากคำขอแต่ละรายการดังกล่าวได้จากผลลัพธ์ทั้งหมด
โดยเรียกใช้
getPhysicalCameraResults()
คำขอจากกล้องจริงแต่ละตัวอาจรองรับพารามิเตอร์เพียงชุดย่อยที่จำกัด หากต้องการรับรายการพารามิเตอร์ที่รองรับ นักพัฒนาแอปสามารถเรียกใช้
getAvailablePhysicalCameraRequestKeys()
ระบบรองรับสตรีมกล้องจริงสำหรับคำขอที่ไม่ใช่การประมวลผลซ้ำและสำหรับเซ็นเซอร์ขาวดำและเซ็นเซอร์ Bayer เท่านั้น
การใช้งาน
รายการตรวจสอบการรองรับ
วิธีเพิ่มอุปกรณ์กล้องหลายตัวแบบตรรกะในฝั่ง HAL
- เพิ่มความสามารถ
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAสำหรับอุปกรณ์กล้องตรรกะใดก็ตามที่รองรับโดยกล้องจริง 2 ตัวขึ้นไป ซึ่งแสดงต่อแอปด้วย - ป้อนข้อมูลในช่องข้อมูลเมตาแบบคงที่
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 แบบตรรกะ 1 รายการด้วยสตรีมจริงที่มีขนาดเท่ากัน (ไม่ใช้กับสตรีม RAW) และรูปแบบเดียวกันจากกล้องจริง 2 ตัว ซึ่งไม่ใช้กับอุปกรณ์ที่ใช้ Android 10
สำหรับอุปกรณ์ที่ใช้ Android 10 ซึ่ง
อุปกรณ์ Camera HAL เวอร์ชัน
3.5
ขึ้นไป อุปกรณ์กล้องต้องรองรับ
isStreamCombinationSupported
เพื่อให้แอปค้นหาได้ว่ารองรับชุดค่าผสมของสตรีมที่เฉพาะเจาะจงซึ่งมี
สตรีมจริงหรือไม่
แผนผังการกำหนดค่าสตรีม
สำหรับกล้องตรรกะ ชุดค่าผสมของสตรีมที่บังคับสำหรับอุปกรณ์กล้องที่มี
ฮาร์ดแวร์ระดับหนึ่งจะเหมือนกับสิ่งที่จำเป็นใน
CameraDevice.createCaptureSession
สตรีมทั้งหมดในแผนผังการกำหนดค่าสตรีมต้องเป็นสตรีมตรรกะ
สำหรับอุปกรณ์กล้องตรรกะที่รองรับความสามารถ RAW พร้อมกล้องย่อยจริงที่มีขนาดแตกต่างกัน หากแอปกำหนดค่าสตรีม RAW แบบตรรกะ อุปกรณ์กล้องตรรกะจะต้องไม่เปลี่ยนไปใช้กล้องย่อยจริงที่มีขนาดเซ็นเซอร์แตกต่างกัน เพื่อให้แน่ใจว่าแอปการจับภาพ RAW ที่มีอยู่จะไม่หยุดทำงาน
หากต้องการใช้ประโยชน์จากการซูมแบบออปติคัลที่ HAL นำไปใช้โดยการสลับระหว่างกล้องย่อยจริงระหว่างการจับภาพ RAW แอปต้องกำหนดค่าสตรีมกล้องย่อยจริงแทนสตรีม RAW แบบตรรกะ
ชุดค่าผสมของสตรีมที่รับประกัน
อุปกรณ์กล้องตรรกะควรทำงานในลักษณะเดียวกับอุปกรณ์กล้องจริงตามระดับและความสามารถของฮาร์ดแวร์ เราขอแนะนำให้ชุดฟีเจอร์ของกล้องตรรกะเป็นชุดฟีเจอร์ที่ใหญ่กว่าของกล้องจริงแต่ละตัว
ในอุปกรณ์ที่ใช้ Android 9 กล้องตรรกะต้องรองรับสิ่งต่อไปนี้สำหรับชุดค่าผสมของสตรีมที่รับประกันแต่ละชุด
การแทนที่สตรีม YUV_420_888 หรือ RAW แบบตรรกะ 1 รายการด้วยสตรีมจริง 2 รายการที่มีขนาดและรูปแบบเดียวกัน โดยแต่ละรายการมาจากกล้องจริงแยกกัน ทั้งนี้กล้องจริงต้องรองรับขนาดและรูปแบบดังกล่าว
การเพิ่มสตรีม RAW 2 รายการ โดยแต่ละรายการมาจากกล้องจริง 1 ตัว หากกล้องตรรกะไม่ได้ประกาศความสามารถ RAW แต่กล้องจริงที่เกี่ยวข้องประกาศความสามารถดังกล่าว โดยปกติแล้วกรณีนี้จะเกิดขึ้นเมื่อกล้องจริงมีขนาดเซ็นเซอร์แตกต่างกัน
การใช้สตรีมจริงแทนสตรีมตรรกะที่มีขนาดและรูปแบบเดียวกัน การดำเนินการนี้ต้องไม่ทำให้เกิดการชะลออัตราเฟรมของการจับภาพเมื่อระยะเวลาเฟรมขั้นต่ำของสตรีมจริงและสตรีมตรรกะเท่ากัน
ข้อควรพิจารณาเกี่ยวกับประสิทธิภาพและการใช้พลังงาน
ประสิทธิภาพ
- การกำหนดค่าและการสตรีมสตรีมจริงอาจทำให้เกิดการชะลออัตราการจับภาพของกล้องตรรกะเนื่องจากข้อจำกัดด้านทรัพยากร
- การใช้การตั้งค่ากล้องจริงอาจทำให้เกิดการชะลออัตราการจับภาพหากตั้งค่ากล้องที่เกี่ยวข้องเป็นอัตราเฟรมที่แตกต่างกัน
การใช้พลังงาน
- การเพิ่มประสิทธิภาพการใช้พลังงานของ HAL จะยังคงทำงานในกรณีเริ่มต้น
- การกำหนดค่าหรือการขอสตรีมจริงอาจลบล้างการเพิ่มประสิทธิภาพการใช้พลังงานภายในของ HAL และทำให้มีการใช้พลังงานมากขึ้น
การปรับแต่ง
คุณปรับแต่งการใช้งานอุปกรณ์ได้ด้วยวิธีต่อไปนี้
- เอาต์พุตที่ผสานรวมของอุปกรณ์กล้องตรรกะขึ้นอยู่กับการใช้งาน HAL ทั้งหมด การตัดสินใจเกี่ยวกับวิธีที่สตรีมตรรกะที่ผสานรวมได้มาจากกล้องจริงจะโปร่งใสต่อแอปและเฟรมเวิร์กกล้องของ Android
- คุณเลือกที่จะรองรับคำขอและผลลัพธ์จากกล้องจริงแต่ละตัวได้ ชุดพารามิเตอร์ที่ใช้ได้ในคำขอดังกล่าวขึ้นอยู่กับการใช้งาน HAL ที่เฉพาะเจาะจงด้วย
- ตั้งแต่ Android 10 เป็นต้นมา HAL สามารถลดจำนวน
กล้องที่แอปเปิดได้โดยตรงด้วยการเลือกที่จะไม่
ประกาศ PHYSICAL_ID บางรายการหรือทั้งหมดใน
getCameraIdListจากนั้นการเรียกใช้getPhysicalCameraCharacteristicsจะต้องแสดงลักษณะของกล้องจริง
การตรวจสอบ
อุปกรณ์กล้องหลายตัวแบบตรรกะต้องผ่าน CTS กล้องเช่นเดียวกับกล้องทั่วไปอื่นๆ
คุณดูเคสทดสอบที่กำหนดเป้าหมายเป็นอุปกรณ์ประเภทนี้ได้ใน
LogicalCameraDeviceTest
โมดูล
การทดสอบ ITS 3 รายการต่อไปนี้กำหนดเป้าหมายเป็นระบบกล้องหลายตัวเพื่อช่วยให้ผสานรวมรูปภาพได้อย่างเหมาะสม
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
การทดสอบฉากที่ 1 และฉากที่ 4 จะทำงานด้วย
แท่นทดสอบ ITS-in-a-box การทดสอบ test_multi_camera_match จะยืนยันว่าความสว่างของกึ่งกลางรูปภาพตรงกันเมื่อเปิดใช้กล้องทั้ง 2 ตัว การทดสอบ test_multi_camera_alignment จะยืนยันว่ามีการโหลดพารามิเตอร์การเว้นระยะห่าง การวางแนว และการบิดเบือนของกล้องอย่างถูกต้อง หากระบบกล้องหลายตัวมีกล้อง FoV กว้าง (>90o) คุณจะต้องใช้กล่อง ITS เวอร์ชัน rev2
Sensor_fusion เป็นแท่นทดสอบที่ 2 ซึ่งช่วยให้สามารถเคลื่อนไหวโทรศัพท์ซ้ำๆ ตามที่กำหนดไว้ และยืนยันว่าการประทับเวลาของเครื่องวัดการหมุนและเซ็นเซอร์รูปภาพตรงกัน และเฟรมของกล้องหลายตัวซิงค์กัน
กล่องทั้งหมดมีจำหน่ายผ่าน AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) และ MYWAY Manufacturing (www.myway.tw, sales@myway.tw) นอกจากนี้ คุณยังซื้อกล่อง ITS เวอร์ชัน rev1 ได้ผ่าน West-Mark (www.west-mark.com, dgoodman@west-mark.com)
แนวทางปฏิบัติแนะนำ
หากต้องการใช้ประโยชน์จากฟีเจอร์ที่กล้องหลายตัวเปิดใช้ได้อย่างเต็มที่พร้อมทั้งรักษาความเข้ากันได้ของแอป ให้ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เมื่อใช้งานอุปกรณ์กล้องหลายตัวแบบตรรกะ
- (Android 10 ขึ้นไป) ซ่อนกล้องย่อยจริงจาก
getCameraIdListซึ่งจะช่วยลดจำนวนกล้องที่แอปเปิดได้โดยตรง ทำให้แอปไม่จำเป็นต้องมีตรรกะการเลือกกล้องที่ซับซ้อน - (Android 11 ขึ้นไป) สำหรับอุปกรณ์กล้องหลายตัวแบบตรรกะที่รองรับการซูมแบบออปติคัล ให้ใช้
ANDROID_CONTROL_ZOOM_RATIOAPI และใช้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_FACE_RECTANGLES, และANDROID_STATISTICS_FACE_LANDMARKSเพื่อให้ถือว่าขอบเขตการมองเห็น หลังการซูมเป็นอาร์เรย์ที่ใช้งานอยู่ของเซ็นเซอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ANDROID_SCALER_CROP_REGIONทำงานร่วมกับANDROID_CONTROL_ZOOM_RATIO, ได้ที่camera3_crop_reprocess#cropping - สำหรับอุปกรณ์กล้องหลายตัวที่มีกล้องจริงที่มีความสามารถแตกต่างกัน ให้ตรวจสอบว่าอุปกรณ์ประกาศการรองรับค่าหรือช่วงหนึ่งๆ สำหรับการควบคุมก็ต่อเมื่อช่วงการซูมทั้งหมดรองรับค่าหรือช่วงดังกล่าว เช่น หากกล้องตรรกะประกอบด้วยกล้องภาพมุมกว้างพิเศษ กล้องภาพมุมกว้าง และกล้องเทเลโฟโต้ ให้ทำดังนี้
- หากขนาดอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงแตกต่างกัน
Camera 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 fps และกล้องภาพมุมกว้างพิเศษรองรับเฉพาะ 4K @ 30 fps หรือ 1080p @ 60 fps แต่ไม่รองรับ 4K @ 60 fps ให้ตรวจสอบว่ากล้องตรรกะไม่ได้ประกาศ 4k @ 60 fps ในการกำหนดค่าสตรีมที่รองรับ ซึ่งจะรับประกันความสมบูรณ์ของความสามารถของกล้องตรรกะ เพื่อให้แน่ใจว่าแอปจะไม่พบปัญหาที่ไม่สามารถแสดงผล 4k @ 60 fps ที่ค่า
ANDROID_CONTROL_ZOOM_RATIOน้อยกว่า 1
- หากขนาดอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงแตกต่างกัน
Camera HAL ต้องทำการแมปจากอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงไปยัง
อาร์เรย์ที่ใช้งานอยู่ของกล้องตรรกะสำหรับ
- ใน Android 10 ขึ้นไป กล้องหลายตัวแบบตรรกะไม่จำเป็นต้องรองรับชุดค่าผสมของสตรีมที่มีสตรีมจริง
หาก HAL รองรับชุดค่าผสมที่มีสตรีมจริง ให้ทำดังนี้
- (Android 11 ขึ้นไป) หากต้องการจัดการกรณีการใช้งานต่างๆ ได้ดียิ่งขึ้น เช่น ความลึกจากภาพสามมิติและการติดตามการเคลื่อนไหว ให้กำหนดขอบเขตการมองเห็นของเอาต์พุตสตรีมจริงให้กว้างที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมจริงและสตรีมตรรกะมาจากกล้องจริงตัวเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจทำให้ขอบเขตการมองเห็นของสตรีมจริงต้องเหมือนกับสตรีมตรรกะ
- หากต้องการแก้ไขปัญหาหน่วยความจำเต็มที่เกิดจากสตรีมจริงหลายรายการ
ให้ตรวจสอบว่าแอปใช้
discardFreeBuffersเพื่อยกเลิกการจัดสรรบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้ใช้ปล่อย แต่ผู้ผลิตยังไม่ได้นำออกจากคิว) หากคาดว่าสตรีมจริงจะไม่ได้ใช้งานเป็น ระยะเวลาหนึ่ง - หากโดยปกติแล้วสตรีมจริงจากกล้องจริงต่างๆ ไม่ได้แนบมากับคำขอเดียวกัน ให้ตรวจสอบว่าแอปใช้
surface groupเพื่อให้คิวบัฟเฟอร์ 1 รายการใช้เพื่อรองรับพื้นผิว 2 รายการที่แอปแสดง ซึ่งจะช่วยลดการใช้หน่วยความจำ