กระแสเอาท์พุต
ระบบย่อยของกล้องทำงานบนไปป์ไลน์ที่ใช้ 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)
พื้นที่ครอบตัด: (500, 375, 1333, 750) (อัตราส่วนภาพ 16:9)
ครอบตัดสตรีม 640x480: (666, 375, 1,000, 750)
การครอบตัดสตรีม 1280x720: (500, 375, 1333, 750) (เท่ากับพื้นที่ครอบตัด)
พื้นที่ครอบตัด: (500, 375, 750, 750) (อัตราส่วนภาพ 1:1)
ครอบตัดสตรีม 640x480: (500, 469, 750, 562)
ครอบตัดสตรีม 1280x720: (500, 543, 750, 414)
และตัวอย่างสุดท้าย สตรีมที่มีอัตราส่วนภาพสี่เหลี่ยมจตุรัส 1024x1024 แทนที่จะเป็นสตรีม 480p:
พื้นที่ครอบตัด: (500, 375, 1000, 750) (อัตราส่วนภาพ 4:3)
ครอบตัดสตรีม 1024x1024: (625, 375, 750, 750)
ครอบตัดสตรีม 1280x720: (500, 469, 1000, 562)
กำลังประมวลผลซ้ำ
การสนับสนุนเพิ่มเติมสำหรับไฟล์ภาพ 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.0; 1/4 ของขอบเขตการมองเห็นดั้งเดิม
พื้นที่ครอบตัด: (0, 187, 2000, 1125) (อัตราส่วนภาพ 16:9)
การครอบตัดสตรีมขนาด 640x480: (250, 187, 1500, 1125) (มีกรอบสี่เหลี่ยม)
การครอบตัดสตรีม 1280x720: (0, 187, 2000, 1125) (เท่ากับพื้นที่ครอบตัด)
อัตราส่วนการซูม: 0.5; 4 เท่าของขอบเขตการมองเห็นดั้งเดิม (เปลี่ยนจากเลนส์ไวด์เป็นเลนส์อัลตร้าไวด์)
พื้นที่ครอบตัด: (250, 0, 1500, 1500) (อัตราส่วนภาพ 1:1)
การครอบตัดสตรีมขนาด 640x480: (250, 187, 1500, 1125) (Letterboxed)
การครอบตัดสตรีม 1280x720: (250, 328, 1500, 844) (Letterboxed)
ดังที่เห็นจากกราฟด้านบน ระบบพิกัดของพื้นที่ครอบตัดจะเปลี่ยนเป็นขอบเขตการมองเห็นหลังการซูมที่มีประสิทธิภาพ และแสดงด้วยสี่เหลี่ยมที่มีขนาดต่อไปนี้: ( 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