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

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

ระบบย่อยของกล้องจะทำงานบนไปป์ไลน์แบบ ANativeWindow เท่านั้นสำหรับ ความละเอียดและรูปแบบเอาต์พุตทั้งหมด คุณสามารถกำหนดค่าสตรีมหลายรายการได้ที่ ในการส่งเฟรมเดียวไปยังหลายเป้าหมาย เช่น GPU, วิดีโอ โปรแกรมเปลี่ยนไฟล์ RenderScript หรือบัฟเฟอร์ที่แอปมองเห็นได้ (RAW Bayer, 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) ด้านล่างแสดงภูมิภาคเอาต์พุตที่คาดไว้ สำหรับแต่ละสตรีมสำหรับตัวอย่างพื้นที่ครอบตัด 3 MP (2000 x) 1500 พิกเซลอาร์เรย์) เซ็นเซอร์

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

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

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

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

อัตราส่วนการครอบตัดภูมิภาค-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)

อัตราส่วนครอบตัดภูมิภาค-43-สี่เหลี่ยมจัตุรัส

รูปที่ 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 สำหรับการครอบตัดแนวนอนและแนวตั้งเป็น ได้สัดส่วนภาพที่ต่างจากเซ็นเซอร์กล้องแบบเดิม

ระบบกล้องหลายตัวอาจมีเลนส์มากกว่าหนึ่งตัวที่มีเลนส์ต่างกัน ความยาวโฟกัส และผู้ใช้สามารถใช้การซูมแบบออปติคัลได้โดยการสลับระหว่างเลนส์ การใช้ 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)

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

อัตราส่วนการซูม 2 ครอบตัด 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) (มีแถบดำด้านบน-ล่างของภาพ)

รูปภาพ/อัตราส่วนการซูม-0.5-ครอบตัด-11

รูปที่ 7 ซูม 0.5 สัดส่วนภาพ 1:1

จากกราฟข้างต้น ระบบพิกัดของพื้นที่ครอบตัดจะเปลี่ยนเป็น ขอบเขตการมองเห็นหลังการซูม และแสดงด้วยสี่เหลี่ยมผืนผ้าที่มีขนาดดังต่อไปนี้ (0, 0, activeArrayWith, activeArrayHeight) เช่นเดียวกันกับภูมิภาค AE/AWB/AF และใบหน้า การเปลี่ยนแปลงระบบพิกัดนี้ไม่มีผลกับ การจับภาพ RAW และข้อมูลเมตาที่เกี่ยวข้อง เช่น intrinsicCalibration และ lensShadingMap

ใช้ตัวอย่างสมมติเดียวกันกับข้างต้น และสมมติว่าสตรีมเอาต์พุต #1 (640x480) คือ การสตรีมผ่านช่องมองภาพ การซูม 2.0 เท่าสามารถทำได้ด้วย 1 ใน 2 วิธีต่อไปนี้

  • 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