Android 9 เปิดตัวการรองรับ API สำหรับอุปกรณ์หลายกล้องผ่านอุปกรณ์กล้องลอจิคัลใหม่ซึ่งประกอบด้วยอุปกรณ์กล้องจริงตั้งแต่สองตัวขึ้นไปที่ชี้ไปในทิศทางเดียวกัน อุปกรณ์กล้องแบบลอจิคัลถูกเปิดเผยเป็น CameraDevice/CaptureSession ตัวเดียวในแอปเพื่อให้สามารถโต้ตอบกับคุณสมบัติกล้องหลายตัวที่ผสานรวม HAL แอปสามารถเลือกเข้าถึงและควบคุมสตรีมข้อมูลเมตาดาต้าและการควบคุมของกล้องจริงที่ซ่อนอยู่ได้
รูปที่ 1 . รองรับกล้องหลายตัว
ในแผนภาพนี้ ID ของกล้องที่แตกต่างกันจะมีรหัสสี แอปสามารถสตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวพร้อมกันได้ นอกจากนี้ยังสามารถตั้งค่าการควบคุมแยกกันและรับข้อมูลเมตาแยกจากกล้องจริงที่แตกต่างกันได้
ตัวอย่างและแหล่งที่มา
อุปกรณ์ที่มีกล้องหลายตัวต้องโฆษณาด้วย ความสามารถแบบลอจิคัลของกล้องหลายตัว
ไคลเอ็นต์กล้องสามารถสอบถาม ID กล้องของอุปกรณ์ฟิสิคัลที่ใช้กล้องลอจิคัลเฉพาะได้โดยการเรียก getPhysicalCameraIds()
จากนั้น ID ที่ส่งคืนโดยเป็นส่วนหนึ่งของผลลัพธ์จะถูกนำมาใช้เพื่อควบคุมอุปกรณ์ทางกายภาพแยกกันผ่าน 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
โดยใช้ 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 ทั้งหมด การตัดสินใจเกี่ยวกับวิธีการรับสตรีมลอจิคัลที่หลอมรวมจากกล้องจริงนั้นมีความโปร่งใสสำหรับแอปและเฟรมเวิร์กกล้องของ 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-a-box การทดสอบ test_multi_camera_match
ยืนยันว่าความสว่างที่กึ่งกลางของภาพตรงกันเมื่อเปิดใช้งานกล้องทั้งสองตัว การทดสอบ test_multi_camera_alignment
ยืนยันว่าพารามิเตอร์ระยะห่างของกล้อง การวางแนว และการบิดเบือนได้รับการโหลดอย่างเหมาะสม หากระบบกล้องหลายตัวมีกล้อง Wide FoV (>90o) ต้องใช้กล่อง ITS เวอร์ชัน rev2
Sensor_fusion
เป็นอุปกรณ์ทดสอบที่สองที่ช่วยให้สามารถเคลื่อนไหวโทรศัพท์ซ้ำตามที่กำหนด และยืนยันว่าไจโรสโคปและประทับเวลาเซ็นเซอร์ภาพตรงกัน และเฟรมของกล้องหลายตัวซิงค์กัน
มีจำหน่ายทุกกล่องผ่านทาง 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_RATIO
API และใช้ANDROID_SCALER_CROP_REGION
สำหรับการครอบตัดอัตราส่วนภาพเท่านั้นANDROID_CONTROL_ZOOM_RATIO
ช่วยให้อุปกรณ์สามารถซูมออกและรักษาความแม่นยำได้ดีขึ้น ในกรณีนี้ HAL จะต้องปรับระบบพิกัดของANDROID_SCALER_CROP_REGION
ANDROID_CONTROL_AWB_REGIONS
ANDROID_CONTROL_AE_REGIONS
ANDROID_CONTROL_AF_REGIONS
ANDROID_STATISTICS_FACE_LANDMARKS
ANDROID_STATISTICS_FACE_RECTANGLES
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่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
เพื่อให้คิวบัฟเฟอร์หนึ่งคิวถูกใช้เพื่อสำรองสองพื้นผิวที่หันเข้าหาแอป ซึ่งจะช่วยลดการใช้หน่วยความจำ