สตรีมเอาต์พุต การครอบตัด และการซูม

สตรีมเอาต์พุต

ระบบย่อยของกล้องจะทำงานในไปป์ไลน์ที่อิงตาม 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)

crop-region-43-ratio

รูปที่ 1 อัตราส่วนภาพ 4:3

พื้นที่ครอบตัด: (500, 375, 1333, 750) (สัดส่วนภาพ 16:9)
การครอบตัดสตรีมขนาด 640x480: (666, 375, 1000, 750)
การครอบตัดสตรีมขนาด 1280x720: (500, 375, 1333, 750) (เท่ากับพื้นที่ครอบตัด)

crop-region-169-ratio

รูปที่ 2 สัดส่วนภาพ 16:9

พื้นที่ครอบตัด: (500, 375, 750, 750) (สัดส่วนภาพ 1:1)
ครอบตัดสตรีม 640x480: (500, 469, 750, 562)
ครอบตัดสตรีม 1280x720: (500, 543, 750, 414)

crop-region-11-ratio

รูปที่ 3 สัดส่วนภาพ 1:1

และตัวอย่างสุดท้ายคือสตรีมที่มีสัดส่วนภาพสี่เหลี่ยมจัตุรัส 1024x1024 แทนสตรีม 480p ดังนี้
พื้นที่ครอบตัด: (500, 375, 1000, 750) (สัดส่วนภาพ 4:3)
ครอบตัดสตรีม 1024x1024: (625, 375, 750, 750)
ครอบตัดสตรีม 1280x720: (500, 469, 1000, 562)

crop-region-43-square-ratio

รูปที่ 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)

zoom-ratio-2-crop-43

รูปที่ 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) (เท่ากับพื้นที่ครอบตัด)

zoom-ratio-2-crop-169

รูปที่ 6 ซูม 2.0, สัดส่วนภาพ 16:9

อัตราส่วนการซูม: 0.5; มุมมองเดิม 4 เท่า (เปลี่ยนจากเลนส์มุมกว้างเป็นเลนส์มุมกว้างพิเศษ)
พื้นที่ครอบตัด: (250, 0, 1500, 1500) (สัดส่วนภาพ 1:1)
การครอบตัดสตรีม 640x480: (250, 187, 1500, 1125) (แถบดำด้านบน-ล่างของภาพ)
การครอบตัดสตรีม 1280x720: (250, 328, 1500, 844) (แถบดำด้านบน-ล่างของภาพ)

images/zoom-ratio-0.5-crop-11

รูปที่ 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