หน้านี้อธิบายการทำงานและการเพิ่มประสิทธิภาพของกล้อง ซึ่งรวมถึงสตรีมเอาต์พุต การครอบตัด การประมวลผลซ้ำ และการซูม
สตรีมเอาต์พุต
ระบบย่อยของกล้องจะทำงานบนไปป์ไลน์ที่อิงตาม ANativeWindow สำหรับ ความละเอียดและรูปแบบเอาต์พุตทั้งหมดเท่านั้น คุณสามารถกำหนดค่าสตรีมหลายรายการพร้อมกันเพื่อส่งเฟรมเดียวไปยังเป้าหมายต่างๆ เช่น GPU, ตัวเข้ารหัสวิดีโอ, RenderScript หรือบัฟเฟอร์ที่แอปมองเห็นได้ (RAW Bayer, บัฟเฟอร์ YUV ที่ประมวลผลแล้ว หรือบัฟเฟอร์ที่เข้ารหัส JPEG)
เพื่อเพิ่มประสิทธิภาพ คุณต้องกำหนดค่าสตรีมเอาต์พุตเหล่านี้ล่วงหน้า และ จะมีได้เพียงจำนวนจำกัดเท่านั้นในแต่ละครั้ง ซึ่งจะช่วยให้มีการจัดสรรบัฟเฟอร์หน่วยความจำล่วงหน้าและการกำหนดค่าฮาร์ดแวร์ของกล้อง เพื่อให้เมื่อมีการส่งคำขอที่มีไปป์ไลน์เอาต์พุตหลายรายการหรือแตกต่างกัน จะไม่มีการหน่วงเวลาหรือเวลาในการตอบสนองในการดำเนินการตามคำขอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับชุดค่าผสมเอาต์พุตสตรีมที่รับประกันซึ่งขึ้นอยู่กับระดับฮาร์ดแวร์ที่รองรับได้ที่
createCaptureSession
การครอบตัด
การครอบตัดอาร์เรย์พิกเซลทั้งหมด (สำหรับการซูมดิจิทัลและกรณีการใช้งานอื่นๆ ที่ต้องการ FOV ที่เล็กลง) จะสื่อสารผ่านการตั้งค่าANDROID_SCALER_CROP_REGION ซึ่งเป็นการตั้งค่าต่อคำขอและสามารถเปลี่ยนแปลงได้ตามคำขอ
ซึ่งมีความสำคัญอย่างยิ่งต่อการใช้งานการซูมดิจิทัลอย่างราบรื่น
ระบบจะกำหนดภูมิภาคเป็นสี่เหลี่ยมผืนผ้า (x, y, width, height) โดย (x, y)
จะอธิบายมุมซ้ายบนของสี่เหลี่ยมผืนผ้า สี่เหลี่ยมผืนผ้าจะกำหนดไว้ใน
ระบบพิกัดของอาร์เรย์พิกเซลที่ใช้งานอยู่ของเซ็นเซอร์ โดย (0,0) คือ
พิกเซลซ้ายบนของอาร์เรย์พิกเซลที่ใช้งานอยู่ ดังนั้น ความกว้างและความสูงจึงต้องไม่ใหญ่กว่าขนาดที่รายงานในช่องข้อมูลคงที่ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY HAL จะรายงานความกว้างและความสูงต่ำสุดที่อนุญาตผ่านช่องข้อมูลคงที่ ANDROID_SCALER_MAX_DIGITAL_ZOOM ซึ่งอธิบาย
ปัจจัยการซูมสูงสุดที่รองรับ ดังนั้น ความกว้างและความสูงของภูมิภาคการครอบตัดต่ำสุดจึงเป็นดังนี้
{width, height} =
{ floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM),
floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
หากภูมิภาคการครอบตัดต้องเป็นไปตามข้อกำหนดที่เฉพาะเจาะจง (เช่น ต้องเริ่มต้นที่พิกัดคู่ และความกว้าง/ความสูงต้องเป็นเลขคู่) HAL จะต้องปัดเศษที่จำเป็นและเขียนข้อมูลเมตาของภูมิภาคการครอบตัดสุดท้ายที่ใช้ในผลลัพธ์เอาต์พุต ในทำนองเดียวกัน หาก HAL ใช้การป้องกันภาพสั่นไหวของวิดีโอ ก็จะต้องปรับภูมิภาคการครอบตัดผลลัพธ์เพื่ออธิบายภูมิภาคที่รวมอยู่ในเอาต์พุตจริงหลังจากใช้การป้องกันภาพสั่นไหวของวิดีโอแล้ว โดยทั่วไป แอปที่ใช้กล้องจะต้องกำหนดขอบเขตการมองเห็นที่ได้รับตามภูมิภาคการครอบตัด ขนาดของเซ็นเซอร์รูปภาพ และความยาวโฟกัสของเลนส์ได้
เนื่องจากภูมิภาคการครอบตัดใช้กับสตรีมทั้งหมด ซึ่งอาจมีสัดส่วนภาพที่แตกต่างจากภูมิภาคการครอบตัด ภูมิภาคเซ็นเซอร์ที่แน่นอนที่ใช้สำหรับแต่ละสตรีมจึงอาจเล็กกว่าภูมิภาคการครอบตัด โดยเฉพาะอย่างยิ่ง แต่ละสตรีมควรคงพิกเซลสี่เหลี่ยมจัตุรัส และสัดส่วนภาพไว้โดยการครอบตัดภูมิภาคการครอบตัดที่กำหนดไว้เพิ่มเติมให้น้อยที่สุด หากสัดส่วนภาพของสตรีมกว้างกว่าภูมิภาคการครอบตัด สตรีม ควรได้รับการครอบตัดเพิ่มเติมในแนวตั้ง และหากสัดส่วนภาพของสตรีมแคบกว่าภูมิภาคการครอบตัด สตรีมควรได้รับการครอบตัดเพิ่มเติมในแนวนอน
ในทุกกรณี การครอบตัดสตรีมต้องอยู่ตรงกลางภายในภูมิภาคการครอบตัดทั้งหมด และ แต่ละสตรีมจะได้รับการครอบตัดในแนวนอนหรือแนวตั้งเท่านั้นเมื่อเทียบกับภูมิภาคการครอบตัดทั้งหมด ไม่ใช่ทั้ง 2 อย่าง
ตัวอย่างเช่น หากมีการกำหนดสตรีม 2 รายการ ได้แก่ สตรีม 640x480 (สัดส่วน 4:3) และ สตรีม 1280x720 (สัดส่วน 16:9) ตัวอย่างด้านล่างแสดงภูมิภาคเอาต์พุตที่คาดไว้ สำหรับแต่ละสตรีมสำหรับภูมิภาคการครอบตัดตัวอย่างบางรายการในเซ็นเซอร์ 3 MP (อาร์เรย์พิกเซล 2000 x 1500) สมมติ
ภูมิภาคการครอบตัด: (500, 375, 1000, 750) (สัดส่วนภาพ 4:3)
การครอบตัดสตรีม 640x480: (500, 375, 1000, 750) (เท่ากับภูมิภาคการครอบตัด)
การครอบตัดสตรีม 1280x720: (500, 469, 1000, 562)
รูปที่ 1 สัดส่วนภาพ 4:3
ภูมิภาคการครอบตัด: (500, 375, 1333, 750) (สัดส่วนภาพ 16:9)
การครอบตัดสตรีม 640x480: (666, 375, 1000, 750)
การครอบตัดสตรีม 1280x720: (500, 375, 1333, 750) (เท่ากับภูมิภาคการครอบตัด)
รูปที่ 2 สัดส่วนภาพ 16:9
ภูมิภาคการครอบตัด: (500, 375, 750, 750) (สัดส่วนภาพ 1:1)
การครอบตัดสตรีม 640x480: (500, 469, 750, 562)
การครอบตัดสตรีม 1280x720: (500, 543, 750, 414)
รูปที่ 3 สัดส่วนภาพ 1:1
และตัวอย่างสุดท้าย สตรีมสัดส่วนภาพสี่เหลี่ยมจัตุรัส 1024x1024 แทนสตรีม 480p
สตรีม:
ภูมิภาคการครอบตัด: (500, 375, 1000, 750) (สัดส่วนภาพ 4:3)
การครอบตัดสตรีม 1024x1024: (625, 375, 750, 750)
การครอบตัดสตรีม 1280x720: (500, 469, 1000, 562)
รูปที่ 4 สัดส่วนภาพ 4:3, สี่เหลี่ยมจัตุรัส
การประมวลผลซ้ำ
การรองรับเพิ่มเติมสำหรับไฟล์รูปภาพ RAW ได้รับการสนับสนุนจากการประมวลผลซ้ำสำหรับข้อมูล RAW Bayer การรองรับนี้ช่วยให้ไปป์ไลน์ของกล้องประมวลผลบัฟเฟอร์ RAW และข้อมูลเมตาที่บันทึกไว้ก่อนหน้านี้ (เฟรมทั้งหมดที่บันทึกไว้ก่อนหน้านี้) เพื่อ สร้างเอาต์พุต YUV หรือ JPEG ที่แสดงผลใหม่
ซูม
สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป แอปสามารถใช้การซูมของกล้อง
(ดิจิทัลและออปติคัล) ผ่านการตั้งค่า ANDROID_CONTROL_ZOOM_RATIO
อัตราส่วนการซูมกำหนดเป็นปัจจัยทศนิยม แทนที่จะใช้ ANDROID_SCALER_CROP_REGION สำหรับการครอบตัดและการซูม แอปสามารถใช้ ANDROID_CONTROL_ZOOM_RATIO เพื่อควบคุมระดับการซูม และใช้ ANDROID_SCALER_CROP_REGION สำหรับการครอบตัดแนวนอนและแนวตั้งเพื่อให้ได้สัดส่วนภาพที่แตกต่างจากเซ็นเซอร์กล้องดั้งเดิม
ระบบกล้องหลายตัวอาจมีเลนส์มากกว่า 1 ตัวที่มีความยาวโฟกัสต่างกัน และผู้ใช้สามารถใช้การซูมออปติคัลได้โดยการสลับระหว่างเลนส์
การใช้ ANDROID_CONTROL_ZOOM_RATIO มีสิทธิประโยชน์ในสถานการณ์ด้านล่าง
- การซูมเข้าจากเลนส์มุมกว้างเป็นเลนส์เทเลโฟโต้: อัตราส่วนทศนิยม
ให้ความแม่นยำมากกว่าค่าจำนวนเต็มของ
ANDROID_SCALER_CROP_REGION - การซูมออกจากเลนส์มุมกว้างเป็นเลนส์มุมกว้างพิเศษ:
ANDROID_CONTROL_ZOOM_RATIOรองรับการซูมออก (<1.0f) ในขณะที่ANDROID_SCALER_CROP_REGIONไม่รองรับ
อัตราส่วนการซูม: 2.0; 1/4 ของขอบเขตการมองเห็นเดิม
ภูมิภาคการครอบตัด: (0, 0, 2000, 1500) (สัดส่วนภาพ 4:3)
การครอบตัดสตรีม 640x480: (0, 0, 2000, 1500) (เท่ากับภูมิภาคการครอบตัด)
การครอบตัดสตรีม 1280x720: (0, 187, 2000, 1125)
รูปที่ 5 การซูม 2.0, สัดส่วนภาพ 4:3
อัตราส่วนการซูม: 2.0; 1/4 ของขอบเขตการมองเห็นเดิม
ภูมิภาคการครอบตัด: (0, 187, 2000, 1125) (สัดส่วนภาพ 16:9)
การครอบตัดสตรีม 640x480: (250, 187, 1500, 1125) (มีแถบดำข้างภาพ)
การครอบตัดสตรีม 1280x720: (0, 187, 2000, 1125) (เท่ากับภูมิภาคการครอบตัด)
รูปที่ 6 การซูม 2.0, สัดส่วนภาพ 16:9
อัตราส่วนการซูม: 0.5; 4 เท่าของขอบเขตการมองเห็นเดิม (เปลี่ยนจากเลนส์มุมกว้างเป็นเลนส์มุมกว้างพิเศษ)
ภูมิภาคการครอบตัด: (250, 0, 1500, 1500) (สัดส่วนภาพ 1:1)
การครอบตัดสตรีม 640x480: (250, 187, 1500, 1125) (มีแถบดำด้านบน-ล่างของภาพ)
การครอบตัดสตรีม 1280x720: (250, 328, 1500, 844) (มีแถบดำด้านบน-ล่างของภาพ)
รูปที่ 7 การซูม 0.5, สัดส่วนภาพ 1:1
จากกราฟด้านบน ระบบพิกัดของภูมิภาคการครอบตัดจะเปลี่ยนเป็นขอบเขตการมองเห็นที่มีประสิทธิภาพหลังการซูม และแสดงด้วยสี่เหลี่ยมผืนผ้าที่มีขนาดดังนี้ (0, 0, activeArrayWith, activeArrayHeight) ซึ่งใช้กับภูมิภาค AE/AWB/AF และใบหน้าด้วย การเปลี่ยนแปลงระบบพิกัดนี้ไม่มีผลกับการบันทึก RAW และข้อมูลเมตาที่เกี่ยวข้อง เช่น intrinsicCalibration และ lensShadingMap
ใช้ตัวอย่างสมมติเดียวกันกับด้านบน และสมมติว่าสตรีมเอาต์พุต #1 (640x480) เป็นสตรีมช่องมองภาพ คุณสามารถซูม 2.0 เท่าได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
zoomRatio = 2.0,scaler.cropRegion = (0, 0, 2000, 1500)zoomRatio = 1.0(ค่าเริ่มต้น),scaler.cropRegion = (500, 375, 1000, 750)
หากต้องการให้แอปตั้งค่า android.control.aeRegions เป็น 1/4 บนซ้ายของขอบเขตการมองเห็นของช่องมองภาพ ให้ตั้งค่า android.control.aeRegions เป็น (0, 0, 1000, 750) โดยตั้งค่า android.control.zoomRatio เป็น 2.0 หรือแอปสามารถตั้งค่า android.control.aeRegions เป็นภูมิภาคที่เทียบเท่ากับ (500, 375, 1000, 750) สำหรับ android.control.zoomRatio เป็น 1.0