Luồng đầu ra, Cắt xén và Thu phóng

Luồng đầu ra

Hệ thống con máy ảnh chỉ hoạt động trên đường dẫn dựa trên ANativeWindow cho tất cả độ phân giải và định dạng đầu ra. Nhiều luồng có thể được định cấu hình cùng một lúc để gửi một khung hình đến nhiều mục tiêu như GPU, bộ mã hóa video, RenderScript hoặc bộ đệm hiển thị trong ứng dụng (RAW Bayer, bộ đệm YUV đã xử lý hoặc bộ đệm được mã hóa JPEG).

Để tối ưu hóa, các luồng đầu ra này phải được định cấu hình trước và chỉ có thể tồn tại một số lượng giới hạn cùng một lúc. Điều này cho phép phân bổ trước bộ đệm bộ nhớ và cấu hình phần cứng máy ảnh để khi gửi yêu cầu với nhiều hoặc các quy trình đầu ra khác nhau được liệt kê, sẽ không có độ trễ hoặc độ trễ trong việc thực hiện yêu cầu.

Để biết thêm thông tin về các kết hợp đầu ra luồng được đảm bảo tùy thuộc vào cấp độ phần cứng được hỗ trợ, hãy xem createCaptureSession() .

Cắt xén

Việc cắt xén mảng pixel đầy đủ (để thu phóng kỹ thuật số và các trường hợp sử dụng khác trong đó mong muốn có FOV nhỏ hơn) được truyền đạt thông qua cài đặt ANDROID_SCALER_CROP_REGION. Đây là cài đặt theo yêu cầu và có thể thay đổi theo yêu cầu, điều này rất quan trọng để triển khai thu phóng kỹ thuật số mượt mà.

Vùng được xác định là một hình chữ nhật (x, y, chiều rộng, chiều cao), với (x, y) mô tả góc trên cùng bên trái của hình chữ nhật. Hình chữ nhật được xác định trên hệ tọa độ của mảng pixel hoạt động của cảm biến, với (0,0) là pixel trên cùng bên trái của mảng pixel hoạt động. Do đó, chiều rộng và chiều cao không thể lớn hơn kích thước được báo cáo trong trường thông tin tĩnh ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Chiều rộng và chiều cao tối thiểu được phép được HAL báo cáo thông qua trường thông tin tĩnh ANDROID_SCALER_MAX_DIGITAL_ZOOM, mô tả hệ số thu phóng được hỗ trợ tối đa. Do đó, chiều rộng và chiều cao tối thiểu của vùng cắt là:

  {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) }

Nếu vùng cắt cần phải đáp ứng các yêu cầu cụ thể (ví dụ: nó cần bắt đầu ở tọa độ chẵn và chiều rộng/chiều cao của nó cần phải chẵn), HAL phải thực hiện làm tròn cần thiết và ghi ra vùng cắt cuối cùng được sử dụng trong đầu ra siêu dữ liệu kết quả. Tương tự, nếu HAL triển khai tính năng ổn định video, nó phải điều chỉnh vùng cắt kết quả để mô tả vùng thực sự có trong đầu ra sau khi áp dụng tính năng ổn định video. Nói chung, ứng dụng sử dụng máy ảnh phải có khả năng xác định trường nhìn mà nó nhận được dựa trên vùng cắt, kích thước của cảm biến hình ảnh và tiêu cự của ống kính.

Vì vùng cắt áp dụng cho tất cả các luồng, có thể có tỷ lệ khung hình khác với vùng cắt, nên vùng cảm biến chính xác được sử dụng cho mỗi luồng có thể nhỏ hơn vùng cắt. Cụ thể, mỗi luồng phải duy trì các pixel vuông và tỷ lệ khung hình của nó bằng cách cắt xén thêm ở mức tối thiểu vùng cắt đã xác định. Nếu tỷ lệ khung hình của luồng rộng hơn vùng cắt thì luồng phải được cắt thêm theo chiều dọc và nếu tỷ lệ khung hình của luồng hẹp hơn vùng cắt thì luồng phải được cắt thêm theo chiều ngang.

Trong mọi trường hợp, phần cắt luồng phải được căn giữa trong vùng cắt toàn bộ và mỗi luồng chỉ được cắt theo chiều ngang hoặc chiều dọc so với vùng cắt toàn bộ, không bao giờ được cắt cả hai.

Ví dụ: nếu hai luồng được xác định, luồng 640x480 (khung hình 4:3) và luồng 1280x720 (khung hình 16:9), bên dưới minh họa các vùng đầu ra dự kiến ​​cho mỗi luồng cho một vài vùng cắt mẫu, trên giả thuyết 3 Cảm biến MP (mảng 2000 x 1500 pixel).

Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Cắt luồng 640x480: (500, 375, 1000, 750) (bằng vùng cắt)
Cắt luồng 1280x720: (500, 469, 1000, 562)

crop-khu vực-43-tỷ lệ

Hình 1. Tỷ lệ khung hình 4:3

Vùng cắt: (500, 375, 1333, 750) (tỷ lệ khung hình 16:9)
Cắt luồng 640x480: (666, 375, 1000, 750)
Cắt luồng 1280x720: (500, 375, 1333, 750) (bằng vùng cắt)

crop-khu vực-169-tỷ lệ

Hình 2. Tỷ lệ khung hình 16:9

Vùng cắt: (500, 375, 750, 750) (tỷ lệ khung hình 1:1)
Cắt luồng 640x480: (500, 469, 750, 562)
Cắt luồng 1280x720: (500, 543, 750, 414)

crop-khu vực-11-tỷ lệ

Hình 3. Tỷ lệ khung hình 1:1

Và ví dụ cuối cùng, luồng tỷ lệ khung hình vuông 1024x1024 thay vì luồng 480p:
Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Cắt luồng 1024x1024: (625, 375, 750, 750)
Cắt luồng 1280x720: (500, 469, 1000, 562)

crop-khu vực-43-vuông-tỷ lệ

Hình 4. Tỷ lệ khung hình 4:3, hình vuông

Tái chế

Hỗ trợ bổ sung cho các tệp hình ảnh thô được cung cấp bằng cách hỗ trợ xử lý lại dữ liệu RAW Bayer. Sự hỗ trợ này cho phép quy trình máy ảnh xử lý siêu dữ liệu và bộ đệm RAW đã chụp trước đó (toàn bộ khung hình đã được ghi trước đó) để tạo ra đầu ra YUV hoặc JPEG được kết xuất mới.

Phóng

Đối với các thiết bị chạy Android 11 trở lên, ứng dụng có thể sử dụng tính năng thu phóng của máy ảnh (kỹ thuật số và quang học) thông qua cài đặt ANDROID_CONTROL_ZOOM_RATIO .

Tỷ lệ thu phóng được xác định là hệ số dấu phẩy động. Thay vì sử dụng ANDROID_SCALER_CROP_REGION để cắt và thu phóng, ứng dụng có thể sử dụng ANDROID_CONTROL_ZOOM_RATIO để kiểm soát mức thu phóng và sử dụng ANDROID_SCALER_CROP_REGION để cắt xén theo chiều ngang và chiều dọc nhằm đạt được tỷ lệ khung hình khác với cảm biến máy ảnh gốc.

Một hệ thống nhiều camera có thể chứa nhiều ống kính với các tiêu cự khác nhau và người dùng có thể sử dụng zoom quang bằng cách chuyển đổi giữa các ống kính. Sử dụng ANDROID_CONTROL_ZOOM_RATIO có lợi ích trong các trường hợp bên dưới:

  • Phóng to từ ống kính rộng sang ống kính chụp ảnh xa: Tỷ lệ dấu phẩy động mang lại độ chính xác tốt hơn so với các giá trị nguyên của ANDROID_SCALER_CROP_REGION .
  • Thu nhỏ từ ống kính rộng sang ống kính siêu rộng: ANDROID_CONTROL_ZOOM_RATIO hỗ trợ thu nhỏ (<1,0f) trong khi ANDROID_SCALER_CROP_REGION thì không.

Để minh họa, đây là một số tình huống có tỷ lệ thu phóng, vùng cắt và luồng đầu ra khác nhau, sử dụng cùng một máy ảnh giả định được xác định trong phần trước.

Tỷ lệ thu phóng: 2,0; 1/4 trường nhìn ban đầu
Vùng cắt: (0, 0, 2000, 1500) (tỷ lệ khung hình 4:3)
Cắt luồng 640x480: (0, 0, 2000, 1500) (bằng vùng cắt)
Cắt luồng 1280x720: (0, 187, 2000, 1125)

tỷ lệ thu phóng-2-crop-43

Hình 5. Thu phóng 2.0, tỷ lệ khung hình 4:3

Tỷ lệ thu phóng: 2,0; 1/4 trường nhìn ban đầu
Vùng cắt: (0, 187, 2000, 1125) (tỷ lệ khung hình 16:9)
Cắt luồng 640x480: (250, 187, 1500, 1125) (đóng hộp)
Cắt luồng 1280x720: (0, 187, 2000, 1125) (bằng vùng cắt)

tỷ lệ thu phóng-2-crop-169

Hình 6. Thu phóng 2.0, tỷ lệ khung hình 16:9

Tỷ lệ thu phóng: 0,5; 4x trường nhìn ban đầu (chuyển từ ống kính rộng sang ống kính siêu rộng)
Vùng cắt: (250, 0, 1500, 1500) (tỷ lệ khung hình 1:1)
Cắt luồng 640x480: (250, 187, 1500, 1125) (có hộp thư)
Cắt luồng 1280x720: (250, 328, 1500, 844) (có hộp thư)

hình ảnh/tỷ lệ thu phóng-0,5-crop-11

Hình 7. Thu phóng 0,5, tỷ lệ khung hình 1:1

Như được thấy từ các biểu đồ ở trên, hệ tọa độ của vùng cắt thay đổi thành trường xem sau khi thu phóng hiệu quả và được biểu thị bằng hình chữ nhật có các kích thước sau: ( 0 , 0 , activeArrayWith , activeArrayHeight ). Điều tương tự cũng áp dụng cho các vùng và khuôn mặt AE/AWB/AF. Thay đổi hệ tọa độ này không áp dụng cho chụp RAW và siêu dữ liệu liên quan của nó như intrinsicCalibrationlensShadingMap .

Sử dụng cùng một ví dụ giả định ở trên và giả sử luồng đầu ra số 1 (640x480) là luồng khung ngắm, bạn có thể đạt được mức thu phóng 2,0 lần theo một trong hai cách:

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (mặc định), scaler.cropRegion = (500, 375, 1000, 750)

Để ứng dụng đặt android.control.aeRegions thành phần trên cùng bên trái của trường xem trong kính ngắm, hãy đặt android.control.aeRegions thành (0, 0, 1000, 750) với android.control.zoomRatio được đặt thành 2.0 . Ngoài ra, ứng dụng có thể đặt android.control.aeRegions thành vùng tương đương (500, 375, 1000, 750) cho android.control.zoomRatio1.0 .