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

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

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

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 ที่เรนเดอร์ใหม่

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)

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) (Pillarbox)
การครอบตัดสตรีม 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 ก็ได้