Android 9 ได้เปิดตัวการรองรับ API สำหรับอุปกรณ์ที่มีกล้องหลายตัว ผ่านอุปกรณ์กล้องตรรกะใหม่ที่ประกอบด้วยอุปกรณ์กล้องจริง 2 ตัวขึ้นไป ซึ่งชี้ไปในทิศทางเดียวกัน อุปกรณ์กล้องตรรกะจะแสดงเป็น CameraDevice/CaptureSession เดียวต่อแอป ซึ่งช่วยให้สามารถโต้ตอบกับฟีเจอร์กล้องหลายตัวที่ผสานรวมกับ HAL ได้ แอปสามารถเลือก เข้าถึงและควบคุมสตรีมกล้องจริง ข้อมูลเมตา และการควบคุมที่เกี่ยวข้องได้
รูปที่ 1 การรองรับกล้องหลายตัว
ในแผนภาพนี้ รหัสกล้องต่างๆ จะมีการกำหนดรหัสสี แอปสามารถ สตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวพร้อมกันได้ นอกจากนี้ยัง ตั้งค่าการควบคุมแยกกันและรับข้อมูลเมตาแยกกันจากกล้อง จริงที่แตกต่างกันได้ด้วย
ตัวอย่างและแหล่งที่มา
อุปกรณ์ที่มีกล้องหลายตัวต้องได้รับการโฆษณาโดยมีความสามารถของกล้องหลายตัวเชิงตรรกะ
ไคลเอ็นต์กล้องสามารถค้นหา Camera ID ของอุปกรณ์จริงที่ใช้สร้างกล้องตรรกะหนึ่งๆ ได้โดยการเรียกใช้ getPhysicalCameraIds()
จากนั้นจะใช้รหัสที่แสดงเป็นส่วนหนึ่งของผลลัพธ์เพื่อควบคุมอุปกรณ์จริง
ทีละเครื่องผ่าน
setPhysicalCameraId()
คุณสามารถค้นหาผลลัพธ์จากคำขอแต่ละรายการดังกล่าวได้จากผลลัพธ์ที่สมบูรณ์โดยเรียกใช้ getPhysicalCameraResults()
คำขอสำหรับกล้องจริงแต่ละรายการอาจรองรับพารามิเตอร์เพียงชุดย่อยที่จำกัดของ
พารามิเตอร์ หากต้องการรับรายการพารามิเตอร์ที่รองรับ นักพัฒนาแอปสามารถเรียกใช้
getAvailablePhysicalCameraRequestKeys()
สตรีมกล้องจริงรองรับเฉพาะคำขอที่ไม่ต้องประมวลผลซ้ำ และรองรับเฉพาะเซ็นเซอร์ขาวดำและเซ็นเซอร์ Bayer
การใช้งาน
รายการตรวจสอบการสนับสนุน
วิธีเพิ่มอุปกรณ์กล้องหลายตัวแบบตรรกะในฝั่ง HAL
- เพิ่มความสามารถ
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
สำหรับอุปกรณ์กล้องตรรกะที่รองรับโดยกล้องจริง 2 ตัวขึ้นไป ซึ่งแสดงต่อแอปด้วย - ป้อนข้อมูลในช่องข้อมูลเมตาของ
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
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) และรูปแบบเดียวกันจากกล้องจริง 2 ตัว การตั้งค่านี้ไม่มีผลกับอุปกรณ์ที่ใช้ Android 10
สำหรับอุปกรณ์ที่ใช้ Android 10 ซึ่งมี
เวอร์ชันอุปกรณ์ HAL ของกล้องเป็น
3.5
ขึ้นไป อุปกรณ์กล้องต้องรองรับ
isStreamCombinationSupported
เพื่อให้แอปค้นหาได้ว่าระบบรองรับการผสมสตรีมที่เฉพาะเจาะจงซึ่งมี
สตรีมจริงหรือไม่
แผนที่การกำหนดค่าสตรีม
สำหรับกล้องตรรกะ ชุดสตรีมที่จำเป็นสำหรับอุปกรณ์กล้องที่มี
ฮาร์ดแวร์ระดับหนึ่งจะเหมือนกับที่กำหนดไว้ใน
CameraDevice.createCaptureSession
สตรีมทั้งหมดในแผนที่การกำหนดค่าสตรีมต้องเป็นสตรีมเชิงตรรกะ
สำหรับอุปกรณ์กล้องตรรกะที่รองรับความสามารถ RAW ที่มีกล้องย่อยจริง ขนาดต่างๆ หากแอปกำหนดค่าสตรีม RAW ตรรกะ อุปกรณ์กล้องตรรกะต้องไม่เปลี่ยนไปใช้กล้องย่อยจริงที่มี ขนาดเซ็นเซอร์แตกต่างกัน วิธีนี้ช่วยให้มั่นใจได้ว่าแอปจับภาพ RAW ที่มีอยู่จะไม่ขัดข้อง
หากต้องการใช้ประโยชน์จากออปติคอลซูมที่ใช้ HAL โดยการสลับระหว่าง กล้องย่อยจริงขณะถ่ายภาพ RAW แอปจะต้อง กำหนดค่าสตรีมกล้องย่อยจริงแทนสตรีม RAW เชิงตรรกะ
การรวมสตรีมที่รับประกัน
ทั้งกล้องเชิงตรรกะและกล้องจริงพื้นฐานต้องรับประกันชุดสตรีมที่จำเป็น ซึ่งจำเป็นสำหรับระดับอุปกรณ์ของกล้อง
อุปกรณ์กล้องแบบตรรกะควรทำงานในลักษณะเดียวกับอุปกรณ์กล้องจริง โดยอิงตามระดับและความสามารถของฮาร์ดแวร์ เราขอแนะนำให้ชุดฟีเจอร์ของกล้องเสมือนเป็นซูเปอร์เซ็ตของกล้องจริงแต่ละตัว
ในอุปกรณ์ที่ใช้ Android 9 กล้องตรรกะต้องรองรับการทำงานต่อไปนี้สำหรับชุดสตรีมที่รับประกันแต่ละชุด
แทนที่สตรีม YUV_420_888 หรือสตรีมดิบเชิงตรรกะ 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.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
ยืนยันว่าความสว่างของ
กึ่งกลางของรูปภาพจะตรงกันเมื่อเปิดใช้กล้องทั้ง 2 ตัว test_multi_camera_alignment
การทดสอบยืนยันว่ามีการโหลดพารามิเตอร์ระยะห่าง การวางแนว และการบิดเบือนของกล้องอย่างถูกต้อง หากระบบกล้องหลายตัว
มีกล้องที่มี FoV กว้าง (>90o) คุณจะต้องใช้ ITS Box เวอร์ชัน 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 ขึ้นไป) สำหรับอุปกรณ์กล้องหลายตัวแบบตรรกะ
ที่รองรับการซูมแบบออปติคัล ให้ใช้ 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_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 FPS และกล้อง
อัลตร้าไวด์รองรับเฉพาะ 4K @ 30 FPS หรือ 1080p @ 60 FPS แต่
ไม่รองรับ 4K @ 60 FPS โปรดตรวจสอบว่ากล้องตรรกะไม่ได้โฆษณา 4K @
60 FPS ในการกำหนดค่าสตรีมที่รองรับ ซึ่งจะรับประกัน
ความสมบูรณ์ของความสามารถของกล้องเชิงตรรกะ เพื่อให้มั่นใจว่าแอปจะไม่
พบปัญหาในการบันทึกที่ความละเอียด 4k @ 60 fps ที่
ANDROID_CONTROL_ZOOM_RATIO
ค่าต่ำกว่า 1
- หากขนาดอาร์เรย์ที่ใช้งานของกล้องจริงแตกต่างกัน HAL ของกล้องต้องทำการแมปจากอาร์เรย์ที่ใช้งานของกล้องจริงไปยัง
อาร์เรย์ที่ใช้งานของกล้องตรรกะสำหรับ
- ตั้งแต่ Android 10 เป็นต้นไป คุณไม่จำเป็นต้องใช้กล้องหลายตัวแบบตรรกะ
เพื่อรองรับการผสมผสานสตรีมที่มีสตรีมจริง
หาก HAL รองรับการรวมกับสตรีมจริง ให้ทำดังนี้
- (Android 11 ขึ้นไป) เพื่อจัดการ Use Case ได้ดียิ่งขึ้น เช่น ความลึกจากสเตอริโอและการติดตามการเคลื่อนไหว ให้กำหนด Field of View ของเอาต์พุตสตรีมจริงให้ใหญ่ที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมจริงและสตรีมเชิงตรรกะมาจากกล้องจริงเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจบังคับให้ฟิลด์ของมุมมองของสตรีมจริงเหมือนกับสตรีมเชิงตรรกะ
- หากต้องการแก้ไขปัญหาหน่วยความจำเต็มที่เกิดจากสตรีมจริงหลายรายการ
โปรดตรวจสอบว่าแอปใช้
discardFreeBuffers
เพื่อยกเลิกการจัดสรรบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้บริโภคปล่อย แต่ผู้ผลิตยังไม่ได้นำออกจากคิว) หากคาดว่าสตรีมจริงจะ ไม่ได้ใช้งานเป็นระยะเวลาหนึ่ง - หากโดยปกติแล้วสตรีมจริงจากกล้องจริงที่แตกต่างกันไม่ได้
แนบมากับคำขอเดียวกัน โปรดตรวจสอบว่าแอปใช้
surface group
เพื่อให้ใช้คิวบัฟเฟอร์เดียวเพื่อสำรองข้อมูลพื้นผิวที่หันหน้าไปทางแอป 2 รายการ ซึ่งจะช่วยลดการใช้หน่วยความจำ