輸出流、裁剪和縮放

輸出流

相機子系統僅在基於 ANativeWindow 的管道上運行,適用於所有分辨率和輸出格式。可以一次配置多個流以將單個幀發送到多個目標,例如 GPU、視頻編碼器、 RenderScript或應用程序可見的緩衝區(RAW Bayer、已處理的 YUV 緩衝區或 JPEG 編碼的緩衝區)。

作為優化,必須提前配置這些輸出流,並且一次只能存在有限的數量。這允許預先分配內存緩衝區和配置相機硬件,以便在提交請求時列出多個或不同的輸出管道,在完成請求時不會出現延遲或延遲。

有關取決於支持的硬件級別的保證流輸出組合的更多信息,請參閱createCaptureSession()

裁剪

通過 ANDROID_SCALER_CROP_REGION 設置傳達全像素陣列的裁剪(用於數字變焦和其他需要較小 FOV 的用例)。這是一個按請求設置,可以根據每個請求進行更改,這對於實現流暢的數字變焦至關重要。

該區域被定義為一個矩形 (x, y, width, height),其中 (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_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)(信箱)

圖像/縮放比例-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設置為1.0android.control.zoomRatio的等效區域(500, 375, 1000, 750)