สตรีมเอาต์พุต
ระบบย่อยของกล้องจะทำงานในไปป์ไลน์ที่อิงตาม ANativeWindow เท่านั้นสำหรับความละเอียดและรูปแบบเอาต์พุตทั้งหมด คุณกำหนดค่าสตรีมหลายรายการพร้อมกันเพื่อส่งเฟรมเดียวไปยังเป้าหมายหลายรายการได้ เช่น GPU, ตัวแปลงรหัสวิดีโอ, RenderScript หรือบัฟเฟอร์ที่แสดงในแอป (บัฟเฟอร์ Bayer รูปแบบ RAW, บัฟเฟอร์ YUV ที่ประมวลผลแล้ว หรือบัฟเฟอร์ที่โค้ดด้วย JPEG)
คุณต้องกำหนดค่าสตรีมเอาต์พุตเหล่านี้ล่วงหน้าเพื่อเพิ่มประสิทธิภาพ และจะมีได้เพียงจำนวนจำกัดเท่านั้น ซึ่งช่วยให้จัดสรรบัฟเฟอร์หน่วยความจำและกำหนดค่าฮาร์ดแวร์ของกล้องล่วงหน้าได้ เมื่อส่งคำขอที่มีไปป์ไลน์เอาต์พุตหลายรายการหรือแตกต่างกันไป ก็จะไม่มีการหน่วงเวลาหรือความล่าช้าในการดำเนินการตามคำขอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับชุดค่าผสมเอาต์พุตสตรีมที่รับประกันซึ่งขึ้นอยู่กับระดับฮาร์ดแวร์ที่รองรับได้ที่ createCaptureSession()
การครอตัด
การครอบตัดอาร์เรย์พิกเซลแบบเต็ม (สำหรับการซูมดิจิตอลและกรณีการใช้งานอื่นๆ ที่ต้องการ FOV ที่เล็กลง) จะสื่อสารผ่านการตั้งค่า ANDROID_SCALER_CROP_REGION การตั้งค่านี้เป็นการตั้งค่าต่อคำขอและสามารถเปลี่ยนแปลงตามคำขอ ซึ่งสำคัญต่อการใช้การซูมดิจิตอลอย่างราบรื่น
ภูมิภาคจะกำหนดเป็นสี่เหลี่ยมผืนผ้า (x, y, กว้าง, สูง) โดย (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) ด้านล่างจะแสดงพื้นที่เอาต์พุตที่คาดไว้สำหรับแต่ละสตรีมสำหรับตัวอย่างพื้นที่ครอบตัด 2-3 รายการบนเซ็นเซอร์ 3 ล้านพิกเซล (อาร์เรย์ 2,000 x 1,500 พิกเซล) สมมติ
พื้นที่ครอบตัด: (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 มาจากการสนับสนุนการประมวลผลข้อมูล Bayer รูปแบบ RAW อีกครั้ง การรองรับนี้ช่วยให้ไปป์ไลน์ของกล้องประมวลผลบัฟเฟอร์ RAW และข้อมูลเมตาที่บันทึกไว้ก่อนหน้านี้ (เฟรมทั้งหมดที่บันทึกไว้ก่อนหน้านี้) เพื่อสร้างเอาต์พุต YUV หรือ JPEG ที่ผ่านการจัดการใหม่
Zoom
สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป แอปจะใช้การซูมของกล้อง (แบบดิจิทัลและแบบออปติคอล) ผ่านการตั้งค่า ANDROID_CONTROL_ZOOM_RATIO
ได้
อัตราส่วนการซูมจะกำหนดเป็นปัจจัยจุดลอยตัว แอปสามารถใช้ ANDROID_CONTROL_ZOOM_RATIO
เพื่อควบคุมระดับการซูม และใช้ ANDROID_SCALER_CROP_REGION
ในการครอบตัดแนวนอนและแนวตั้งเพื่อให้ได้สัดส่วนภาพที่แตกต่างจากเซ็นเซอร์กล้องของอุปกรณ์แทนการใช้ 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 เท่าทำได้ 2 วิธีดังนี้
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(ค่าเริ่มต้น),scaler.cropRegion = (500, 375, 1000, 750)
หากต้องการให้แอปตั้งค่า android.control.aeRegions
เป็นไตรมาสซ้ายบนของมุมมองช่องมองภาพ ให้ตั้งค่า android.control.aeRegions
เป็น (0, 0, 1000, 750)
โดยตั้งค่า android.control.zoomRatio
เป็น 2.0
หรือแอปอาจตั้งค่า android.control.aeRegions
เป็นภูมิภาคที่เทียบเท่า (500, 375, 1000, 750)
สำหรับ android.control.zoomRatio
ของ 1.0