출력 스트림, 자르기, 확대/축소

출력 스트림

모든 해상도 및 출력 형식에서 카메라 하위 시스템은 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이 동영상 안정화를 구현하는 경우 동영상 안정화가 적용된 후 출력에 실제로 포함되는 영역을 설명하도록 결과의 자르기 영역을 조정해야 합니다. 일반적으로 카메라를 사용하는 애플리케이션은 자르기 영역, 이미지 센서의 크기 및 렌즈 초점 거리에 따라 수신하는 시야를 결정할 수 있어야 합니다.

자르기 영역은 자르기 영역과 가로세로 비율이 다를 수 있는 모든 스트림에 적용되므로 각 스트림에 사용되는 정확한 센서 영역은 자르기 영역보다 작을 수 있습니다. 특히 각 스트림은 정의된 자르기 영역을 최소한으로 더 잘라서 정사각형 픽셀과 가로세로 비율을 유지해야 합니다. 스트림의 가로세로 비율이 자르기 영역보다 넓으면 스트림을 수직으로 더 자르고, 스트림의 가로세로 비율이 자르기 영역보다 좁으면 스트림을 수평으로 더 잘라야 합니다.

모든 경우에 스트림 자르기는 전체 자르기 영역의 중앙에 위치해야 하며, 각 스트림은 전체 자르기 영역을 기준으로 수평이나 수직 중 한쪽으로만 잘리며, 양쪽이 다 잘리지는 않습니다.

예를 들어 640 x 480 스트림(4:3 비율)과 1280 x 720 스트림(16:9 비율)의 두 스트림이 정의되고, 센서가 3MP(2000 x 1500 픽셀 배열)라고 가정했을 때 다음은 각 스트림 일부 샘플 자르기 영역의 예상 출력 영역을 보여 줍니다.

자르기 영역: (500, 375, 1000, 750)(4:3 가로세로 비율)
640 x 480 스트림 자르기: (500, 375, 1000, 750)(자르기 영역과 동일)
1280 x 720 스트림 자르기: (500, 469, 1000, 562)

crop-region-43-ratio

그림 1. 4:3 가로세로 비율

자르기 영역: (500, 375, 1333, 750)(16:9 가로세로 비율)
640 x 480 스트림 자르기: (666, 375, 1000, 750)
1280 x 720 스트림 자르기: (500, 375, 1333, 750)(자르기 영역과 동일)

crop-region-169-ratio

그림 2. 16:9 가로세로 비율

자르기 영역: (500, 375, 750, 750)(1:1 가로세로 비율)
640 x 480 스트림 자르기: (500, 469, 750, 562)
1280 x 720 스트림 자르기: (500, 543, 750, 414)

crop-region-11-ratio

그림 3. 1:1 가로세로 비율

마지막 예는 480p 스트림이 아닌 1024 x 1024의 정사각형 가로세로 비율 스트림입니다.
자르기 영역: (500, 375, 1000, 750)(4:3 가로세로 비율)
1024 x 1024 스트림 자르기: (625, 375, 750, 750)
1280 x 720 스트림 자르기: (500, 469, 1000, 562)

crop-region-43-square-ratio

그림 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 가로세로 비율)
640 x 480 스트림 자르기: (0, 0, 2000, 1500)(자르기 영역과 동일)
1280 x 720 스트림 자르기: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

그림 5. 2.0 확대/축소, 4:3 가로세로 비율

확대/축소 비율: 2.0, 원본 시야의 1/4
자르기 영역: (0, 187, 2000, 1125)(16:9 가로세로 비율)
640 x 480 스트림 자르기: (20, 187, 1500, 1125)(필러박스)
1280 x 720 스트림 자르기: (0, 187, 2000, 1125)(자르기 영역과 동일)

zoom-ratio-2-crop-169

그림 6. 2.0 확대/축소, 16:9 가로세로 비율

확대/축소 비율: 0.5, 원본 시야의 4배(광각 렌즈에서 울트라와이드 렌즈로 전환)
자르기 영역: (250, 0, 1500, 1500)(1:1 가로세로 비율)
640 x 480 스트림 자르기: (250, 187, 1500, 1215)(레터박스)
1280 x 720 스트림 자르기: (250, 328, 1500, 844)(레터박스)

images/zoom-ratio-0.5-crop-11

그림 7. 0.5 확대/축소, 1:1 가로세로 비율

위 그래프에서 볼 수 있듯이 자르기 영역의 좌표계는 유효한 확대/축소 후 시야에 따라 변경되며 직사각형으로 표시됩니다(치수: 0, 0, activeArrayWith, activeArrayHeight). AE/AWB/AF 영역 및 얼굴에도 적용됩니다. 이 좌표계는 RAW 캡처 및 intrinsicCalibration, lensShadingMap과 같은 관련 메타데이터에 적용되지 않습니다.

위와 동일한 가상의 예에서 출력 스트림 #1(640 x 480)이 뷰파인더 스트림이라고 가정할 때 다음 둘 중 한 가지 방법으로 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.zoomRatio2.0으로 설정합니다. 또는 앱은 android.control.zoomRatio1.0인 동등한 (500, 375, 1000, 750) 영역으로 android.control.aeRegions를 설정할 수 있습니다.