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

หน้านี้อธิบายการทำงานและการเพิ่มประสิทธิภาพของกล้อง ซึ่งรวมถึงสตรีมเอาต์พุต การครอบตัด การประมวลผลซ้ำ และการซูม

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

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

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 ได้รับการสนับสนุนจากการประมวลผลซ้ำสำหรับข้อมูล 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)

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 เท่าได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

  • 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