輸出流、裁剪和縮放

輸出流

相機子系統僅在基於 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, 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 Bayer 資料的重新處理支援提供了對原始影像檔案的額外支援。此支援允許相機管道處理先前捕獲的 RAW 緩衝區和元資料(先前記錄的整個幀),以產生新的渲染 YUV 或 JPEG 輸出。

飛漲

對於運行 Android 11 或更高版本的設備,應用程式可以透過ANDROID_CONTROL_ZOOM_RATIO設定使用相機的變焦(數位和光學)。

縮放比例定義為浮點係數。應用程式可以使用ANDROID_SCALER_CROP_REGION來控制縮放級別,並使用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-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)(等於裁切區域)

縮放比例-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)(信箱式)

圖/zoom-ratio-0.5-crop-11

圖 7. 0.5 倍變焦,1:1 縱橫比

從上圖可以看出,裁剪區域的座標系變為縮放後的有效視野,並由具有以下尺寸的矩形表示:( 0 , 0 , activeArrayWith , activeArrayHeight )。這同樣適用於 AE/AWB/AF 區域和臉部。此座標系變更不適用於 RAW 擷取及其相關元數據,例如intrinsicCalibrationlensShadingMap

使用上面相同的假設範例,並假設輸出流 #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設定為android.control.zoomRatio 1.0的等效區域(500, 375, 1000, 750)