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

กระแสเอาท์พุต

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

เนื่องจากพื้นที่ครอบตัดใช้กับสตรีมทั้งหมด ซึ่งอาจมีอัตราส่วนภาพที่แตกต่างจากพื้นที่ครอบตัด พื้นที่เซ็นเซอร์ที่แน่นอนที่ใช้สำหรับแต่ละสตรีมจึงอาจเล็กกว่าพื้นที่ครอบตัด โดยเฉพาะอย่างยิ่ง แต่ละสตรีมควรรักษาพิกเซลสี่เหลี่ยมจัตุรัสและอัตราส่วนภาพไว้โดยการครอบตัดพื้นที่ครอบตัดที่กำหนดไว้เพิ่มเติมให้น้อยที่สุด หากอัตราส่วนภาพของสตรีมกว้างกว่าพื้นที่ครอบตัด ควรครอบตัดสตรีมเพิ่มเติมในแนวตั้ง และหากอัตราส่วนภาพของสตรีมแคบกว่าพื้นที่ครอบตัด สตรีมควรครอบตัดเพิ่มเติมในแนวนอน

ในทุกกรณี การครอบตัดสตรีมจะต้องอยู่กึ่งกลางภายในขอบเขตการครอบตัดแบบเต็ม และแต่ละสตรีมจะถูกครอบตัดในแนวนอนหรือแนวตั้งเท่านั้นโดยสัมพันธ์กับขอบเขตการครอบตัดแบบเต็ม ไม่มีทั้งสองอย่าง

ตัวอย่างเช่น หากมีการกำหนดสตรีมสองรายการ ได้แก่ สตรีมขนาด 640x480 (อัตราส่วน 4:3) และสตรีมขนาด 1280x720 (อัตราส่วน 16:9) ด้านล่างจะแสดงขอบเขตเอาต์พุตที่คาดหวังสำหรับแต่ละสตรีมสำหรับขอบเขตการครอบตัดตัวอย่างบางส่วน ตามสมมุติฐาน 3 เซ็นเซอร์ MP (อาร์เรย์ 2000 x 1500 พิกเซล)

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

อัตราส่วนพื้นที่เพาะปลูก-43

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

พื้นที่ครอบตัด: (500, 375, 1333, 750) (อัตราส่วนภาพ 16:9)
ครอบตัดสตรีม 640x480: (666, 375, 1,000, 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 ที่เรนเดอร์ใหม่

ซูม

สำหรับอุปกรณ์ที่ใช้ 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) (Letterboxed)
การครอบตัดสตรีม 1280x720: (250, 328, 1500, 844) (Letterboxed)

รูปภาพ/อัตราส่วนการซูม-0.5-ครอบตัด-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 ให้เป็นไตรมาสซ้ายบนของช่องมองภาพ ให้ตั้งค่า android.control.aeRegions เป็น (0, 0, 1000, 750) โดยตั้งค่า android.control.zoomRatio เป็น 2.0 อีกทางหนึ่ง แอปสามารถตั้งค่า android.control.aeRegions เป็นขอบเขตที่เทียบเท่ากับ (500, 375, 1000, 750) สำหรับ android.control.zoomRatio ที่ 1.0