Android 9 เปิดตัวการรองรับ API สำหรับกล้องหลายตัว ผ่านอุปกรณ์กล้องลอจิคัลใหม่ที่ประกอบด้วยอุปกรณ์ทางกายภาพสองเครื่องขึ้นไป อุปกรณ์กล้องที่ชี้ไปยังทิศทางเดียวกัน อุปกรณ์กล้องแบบลอจิคัลคือ เป็น CameraDevice/CaptureSession เดียวในแอปที่ช่วยให้ การโต้ตอบกับฟีเจอร์กล้องหลายตัวที่ผสานรวมแบบ HAL แอปสามารถเลือกได้ เข้าถึงและควบคุมสตรีม ข้อมูลเมตา และการควบคุมกล้องจริงที่เกี่ยวข้อง
รูปที่ 1 การรองรับกล้องหลายตัว
ในแผนภาพนี้ รหัสกล้องที่ต่างกันจะมีรหัสสี แอปสามารถ สตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวพร้อมกัน และยัง เพื่อตั้งค่าการควบคุมแยกต่างหาก และรับข้อมูลเมตาแยกต่างหากจาก ด้วยกล้องจริง
ตัวอย่างและแหล่งที่มา
อุปกรณ์กล้องหลายตัวต้องโฆษณาด้วย แบบใช้กล้องหลายตัว
ไคลเอ็นต์กล้องจะค้นหารหัสกล้องของอุปกรณ์จริงได้
กล้องเชิงตรรกะสร้างขึ้นโดยการโทร
getPhysicalCameraIds()
จากนั้นระบบจะใช้รหัสที่ส่งคืนเพื่อควบคุมอุปกรณ์จริง
ทีละรายการผ่าน
setPhysicalCameraId()
ผลลัพธ์จากคำขอแต่ละรายการสามารถสอบถามได้จาก
ผลลัพธ์โดยการเรียกใช้
getPhysicalCameraResults()
คำขอเกี่ยวกับกล้องจริงอาจรองรับแค่กลุ่มย่อยของ
พารามิเตอร์ หากต้องการรับรายการพารามิเตอร์ที่รองรับ นักพัฒนาแอปสามารถเรียกใช้
getAvailablePhysicalCameraRequestKeys()
สตรีมจากกล้องจริงรองรับเฉพาะคำขอที่ไม่ประมวลผลซ้ำและ สำหรับเซ็นเซอร์โมโนโครมและเซ็นเซอร์ไบเออร์เท่านั้น
การใช้งาน
รายการตรวจสอบการสนับสนุน
วิธีเพิ่มอุปกรณ์กล้องหลายตัวแบบลอจิคัลในด้าน 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
ตามนั้นสำหรับอุปกรณ์ 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 เชิงตรรกะหรือสตรีมดิบหนึ่งรายการด้วยสตรีมทางกายภาพสองสตรีมของ มีขนาดและรูปแบบเดียวกัน โดยแต่ละกล้องเป็นกล้องจริงที่แยกกัน ขนาดและรูปแบบที่กล้องจริงรองรับ
การเพิ่มสตรีมดิบ 2 รายการ แต่ละรายการจากกล้องทางกายภาพแต่ละตัว หากกล้องตรรกะ ไม่ได้โฆษณาความสามารถของ RAW แต่กล้องจริงที่นำมาใช้ได้จริง กรณีนี้มักเกิดขึ้นเมื่อกล้องจริงมีขนาดเซ็นเซอร์ต่างกัน
การใช้สตรีมทางกายภาพแทนสตรีมเชิงตรรกะที่มีขนาดเดียวกันและ ซึ่งต้องไม่ทำให้อัตราเฟรมของการจับภาพช้าลงเมื่อ ระยะเวลาเฟรมขั้นต่ำของสตรีมทางกายภาพและทางตรรกะเท่ากัน
การพิจารณาประสิทธิภาพและพลังงาน
ประสิทธิภาพ
- การกำหนดค่าและการสตรีมอุปกรณ์จริงอาจทำให้ อัตราการจับภาพของกล้องเชิงตรรกะเนื่องจากข้อจำกัดด้านทรัพยากร
- การใช้การตั้งค่ากล้องจริงอาจชะลออัตราการจับภาพหาก กล้องที่ใช้จะอยู่ในอัตราเฟรมต่างกัน
กำลังไฟฟ้า:
- การเพิ่มประสิทธิภาพการใช้ไฟของ HAL จะยังคงทํางานต่อไปในกรณีเริ่มต้น
- การกำหนดค่าหรือการส่งคำขอสตรีมทางกายภาพอาจลบล้างสิทธิ์ภายในของ HAL ส่งผลให้ใช้พลังงานมากขึ้น
การปรับแต่ง
คุณสามารถปรับแต่งการใช้งานอุปกรณ์ได้ด้วยวิธีต่อไปนี้
- เอาต์พุต Fused ของอุปกรณ์กล้องเชิงตรรกะจะขึ้นอยู่กับ HAL ทั้งหมด การใช้งานของคุณ การตัดสินว่าสตรีมเชิงตรรกะรวมเข้าด้วยกันอย่างไร กล้องจริงจะโปร่งใสกับแอปและกล้อง Android
- คุณจะเลือกรองรับคำขอและผลการตรวจแต่ละรายการหรือไม่ก็ได้ ของชุดพารามิเตอร์ที่มีอยู่ในคำขอดังกล่าวจะขึ้นอยู่กับ การติดตั้งใช้งาน 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-box
อุปกรณ์ การทดสอบ test_multi_camera_match
ยืนยันว่าค่าความสว่างของ
กึ่งกลางของรูปภาพตรงกันเมื่อเปิดใช้กล้องทั้ง 2 ตัว
การทดสอบ test_multi_camera_alignment
ยืนยันว่าระยะห่าง การวางแนวของกล้อง
และระบบโหลดพารามิเตอร์การบิดเบี้ยวอย่างถูกต้อง หากระบบกล้องหลายตัว
มีกล้องมุมกว้าง (>90o) ต้องใช้กล่อง ITS เวอร์ชัน rev2
Sensor_fusion
เป็นอุปกรณ์ทดสอบรายการที่ 2 ที่เปิดใช้โทรศัพท์ที่กำหนดไว้ล่วงหน้าตามคำสั่งที่กำหนดไว้
การเคลื่อนไหวและยืนยันว่าการประทับเวลาของเครื่องวัดการหมุนและเซ็นเซอร์รูปภาพตรงกัน
เฟรมกล้องหลายตัวซิงค์กัน
กล่องทั้งหมดมีให้บริการใน AcuSpec, Inc. (www.acuspecinc.com fred@acuspecinc.com) และ MYWAY การผลิต (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_RATIO
API และใช้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 ขึ้นไป) เพื่อรองรับการใช้งานได้ดียิ่งขึ้น เช่น ความลึกจากการติดตามสเตอริโอและการเคลื่อนไหว ให้พยายาม ของเอาต์พุตสตรีมทางกายภาพให้ใหญ่ที่สุดเท่าที่ฮาร์ดแวร์ทำได้ อย่างไรก็ตาม หากสตรีมทางกายภาพและสตรีมเชิงตรรกะมาจากแหล่งที่มาเดียวกัน สำหรับกล้องจริง ข้อจำกัดของฮาร์ดแวร์ อาจบังคับใช้ขอบเขตการมองเห็น สตรีมทางกายภาพนั้นเหมือนกับสตรีมเชิงตรรกะ
- ในการจัดการกับความกดดันหน่วยความจำที่เกิดจากสตรีมทางกายภาพหลายรายการ
ตรวจสอบว่าแอปใช้
discardFreeBuffers
ในการจัดการบัฟเฟอร์อิสระ (บัฟเฟอร์ที่ผู้บริโภคปล่อยออกมา แต่ยังไม่ได้ยกเลิกคิวโดยผู้ผลิต) หากคาดว่าสตรีมจะ ไม่มีความเคลื่อนไหวเป็นระยะเวลาหนึ่ง - หากโดยทั่วไปแล้ว สตรีมจากอุปกรณ์จับต้องได้หลายตัว
แนบไปกับคำขอเดียวกัน โปรดตรวจสอบว่าแอปใช้
surface group
เพื่อให้มีการใช้คิวบัฟเฟอร์ 1 รายการเพื่อรองรับ 2 แพลตฟอร์มที่แสดงแอป ซึ่งช่วยลดการใช้หน่วยความจำ