สตรีมเอาต์พุต
ระบบย่อยของกล้องจะทำงานในไปป์ไลน์ที่อิงตาม 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 ใช้การป้องกันภาพสั่นไหวของวิดีโอ HAL ต้องปรับภูมิภาคครอบตัดผลลัพธ์เพื่ออธิบายภูมิภาคที่รวมอยู่ใน เอาต์พุตจริงหลังจากใช้การป้องกันภาพสั่นไหวของวิดีโอ โดยทั่วไปแล้ว แอปที่ใช้กล้องต้องระบุขอบเขตการมองเห็นที่ได้รับตามภูมิภาคครอบตัด ขนาดของเซ็นเซอร์รูปภาพ และความยาวโฟกัสของเลนส์ได้
เนื่องจากภูมิภาคครอบตัดใช้กับสตรีมทั้งหมด ซึ่งอาจมีสัดส่วนภาพแตกต่างจากภูมิภาคครอบตัด ภูมิภาคเซ็นเซอร์ที่แน่นอนที่ใช้สำหรับแต่ละสตรีมจึงอาจเล็กกว่าภูมิภาคครอบตัด โดยเฉพาะอย่างยิ่ง สตรีมแต่ละรายการควรคงพิกเซลสี่เหลี่ยมจัตุรัส และสัดส่วนภาพไว้ด้วยการครอบตัดเพิ่มเติมในระดับต่ำสุดในภูมิภาคการครอบตัดที่กำหนด หากสัดส่วนภาพของสตรีมกว้างกว่าพื้นที่ครอบตัด คุณควรครอบตัดสตรีม ในแนวตั้งเพิ่มเติม และหากสัดส่วนภาพของสตรีมแคบกว่าพื้นที่ครอบตัด คุณควรครอบตัดสตรีม ในแนวนอนเพิ่มเติม
ในทุกกรณี การครอบตัดสตรีมต้องอยู่ตรงกลางภายในภูมิภาคการครอบตัดทั้งหมด และ แต่ละสตรีมจะได้รับการครอบตัดในแนวนอนหรือแนวตั้งเท่านั้นเมื่อเทียบกับภูมิภาคการครอบตัดทั้งหมด ไม่ใช่ทั้ง 2 อย่าง
ตัวอย่างเช่น หากกำหนดสตรีม 2 รายการ ได้แก่ สตรีม 640x480 (สัดส่วน 4:3) และสตรีม 1280x720 (สัดส่วน 16:9) ด้านล่างนี้แสดงภูมิภาคเอาต์พุตที่คาดไว้สำหรับแต่ละสตรีมสำหรับภูมิภาคครอบตัดตัวอย่าง 2-3 รายการในเซ็นเซอร์สมมติขนาด 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 ที่เรนเดอร์ใหม่
Zoom
สำหรับอุปกรณ์ที่ใช้ 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) (Pillarbox)
การครอบตัดสตรีม 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
ก็ได้