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

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

ระบบย่อยของกล้องจะทำงานบนไปป์ไลน์แบบ 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, 7503 เป็นภูมิภาค) (การครอบตัด equal เป็น 1333)

อัตราส่วนการครอบตัดภูมิภาค-169

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

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

อัตราส่วนการครอบตัดภูมิภาค 11

รูปที่ 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_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 เท่าทำได้ 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 ก็ได้