輸出串流、裁剪及縮放

輸出串流

相機子系統只會在所有解析度和輸出格式的 ANativeWindow 管道上運作。您可以一次設定多個串流,將單一影格傳送至多個目標,例如 GPU、影片編碼器、RenderScript 或應用程式可見的緩衝區 (RAW Bayer、經處理的 YUV 緩衝區或 JPEG 編碼緩衝區)。

為了達到最佳化,這些輸出串流必須事先設定,且一次只能存在有限的串流。這樣一來,您就可以預先分配相機硬體的記憶體緩衝區和設定。這樣一來,如果提交要求時包含多個或不同的輸出管道,處理要求時就不會出現延遲或延遲。

如要進一步瞭解取決於支援硬體等級的保證串流輸出組合,請參閱 createCaptureSession()

裁剪

透過 ANDROID_SCALER_CROP_REGION 設定,可傳達全像素陣列裁剪資訊 (適用於數位變焦和其他需要較小 FOV 的用途)。這是個別要求的設定,可依個別要求進行變更,這是實作流暢數位變焦的絕佳關鍵。

區域定義為矩形 (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 長寬比),以假設的 300 萬像素 (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、753)

Clip-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

最後再以 1024 x 1024 的正方形顯示比例串流,而非 480p 串流:
裁剪區域:(500、375、1000、750) (4:3 顯示比例)
1024x1024 串流裁剪:(625、375、750)
1024x1024 串流裁剪:625、375、750、 924 和 750

crop-region-43-square-ratio

圖 4. 4:3 顯示比例,正方形

重新處理

系統會重新處理 RAW Bayer 資料,藉此對原始圖片檔提供額外支援。這項支援功能可讓相機管道處理先前擷取的 RAW 緩衝區和中繼資料 (先前記錄的整個影格),產生新的算繪 YUV 或 JPEG 輸出內容。

Zoom

針對搭載 Android 11 以上版本的裝置,應用程式可以透過 ANDROID_CONTROL_ZOOM_RATIO 設定使用相機的數位和光學變焦功能。

縮放比例的定義為浮點因數。應用程式可以使用 ANDROID_CONTROL_ZOOM_RATIO 控制縮放等級,並使用 ANDROID_SCALER_CROP_REGION 進行水平和垂直裁剪,以便取得與原生攝影機感應器不同的顯示比例。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) (與裁剪區域相同)
1280x1

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

如上圖所示,裁剪區域的座標系統會變更為有效的縮放後視野,並以矩形表示,其尺寸為:(00activeArrayWithactiveArrayHeight)。AE/AWB/AF 區域和臉孔也適用相同的做法。這項座標系統變更不適用於 RAW 擷取作業,以及相關的中繼資料,例如 intrinsicCalibrationlensShadingMap

以上述的假設範例,並假設輸出串流 #1 (640x480) 是觀景器串流,可以透過下列其中一種方式達到 2.0 倍變焦:

  • zoomRatio = 2.0scaler.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 設為 1.0android.control.zoomRatio(500, 375, 1000, 750) 等同區域。