Luồng đầu ra, cắt và thu phóng

Luồng đầu ra

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

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

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

Cắt xen

Cắt mảng pixel đầy đủ (để thu phóng kỹ thuật số và các trường hợp sử dụng khác khi FOV nhỏ hơn là mong muốn) được thông báo thông qua ANDROID_SCALER_CROP_REGION cài đặt. Đây là chế độ cài đặt theo từng yêu cầu và có thể thay đổi theo từng yêu cầu, điều này rất quan trọng để triển khai tính năng thu phóng kỹ thuật số mượt mà.

Khu vực được định nghĩa là 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 này được xác định trên hệ toạ độ của mảng pixel hoạt động 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 được lớn hơn kích thước được báo cáo trong ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY trường thông tin tĩnh. Chiều rộng và chiều cao tối thiểu cho phép do HAL (Lớp trừu tượng phần cứng) báo cáo thông qua trường thông tin tĩnh ANDROID_SCALER_MAX_DIGITAL_ZOOM, trường này mô tả hệ số thu phóng tối đa được hỗ trợ. Do đó, chiều rộng tối thiểu của vùng cắt và chiều cao 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 đáp ứng các yêu cầu cụ thể (ví dụ: để bắt đầu trên toạ độ chẵn và chiều rộng/chiều cao của nó phải là chẵn), HAL phải làm tròn cần thiết và viết ra vùng cắt cuối cùng được sử dụng trong siêu dữ liệu kết quả đầu ra. Tương tự, nếu HAL thực hiện tính năng ổn định video, phải điều chỉnh vùng kết quả để mô tả khu vực thực sự được đưa vào đầu ra sau khi áp dụng tính năng ổn định video. Nhìn chung, việc sử dụng máy ảnh ứng dụng phải có khả năng xác định trường nhìn mà ứng dụng đang nhận được dựa trên vùng bị 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 bị cắt áp dụng cho tất cả các dòng tin nên có thể có khía cạnh khác hơn so với vùng cắt, vùng cảm biến chính xác được sử dụng cho mỗi luồng có thể là nhỏ hơn vùng bị cắt. Cụ thể, mỗi luồng phải duy trì pixel và tỷ lệ khung hình bằng cách cắt thêm một chút để cắt ảnh 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át trực tiếp sẽ được cắt thêm theo chiều dọc và nếu tỷ lệ co của luồng là hẹp hơn vùng bị cắt, luồng sẽ bị cắt thêm theo chiều ngang.

Trong mọi trường hợp, phần cắt trong 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 toàn bộ vùng cắt, không được bao gồm cả hai.

Ví dụ: nếu hai luồng được xác định, một luồng 640x480 (4:3) và một Luồng 1280x720 (khung hình 16:9), bên dưới thể hiện các vùng đầu ra dự kiến cho mỗi dòng dữ liệu của một vài vùng cây trồng mẫu, trên 3 MP giả định (2000 x 1500 pixel).

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

tỷ lệ cây trồng theo vùng 43

Hình 1. Tỷ lệ cỡ ảnh 4:3

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

tỷ lệ cây trồng theo vùng 169

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)
Hình ảnh cắt trong luồng 640x480: (500, 469, 750, 562)
Cắt luồng 1280x720: (500, 543, 750, 414)

tỷ lệ cây trồng theo vùng 11

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

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

tỷ lệ vùng 43 vuông

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

Đang xử lý lại

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

Zoom (thu phóng)

Đối với các thiết bị chạy Android 11 trở lên, ứng dụng có thể 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 chế độ cài đặt ANDROID_CONTROL_ZOOM_RATIO.

Tỷ lệ thu phóng được định nghĩa là hệ số dấu phẩy động. Thay vì dùng ANDROID_SCALER_CROP_REGION để cắt và thu phóng, một ứ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 theo chiều ngang và chiều dọc để đạ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 loại ống kính khác nhau tiêu cự và người dùng có thể sử dụng tính năng thu phóng quang học bằng cách chuyển đổi giữa các ống kính. Việc sử dụng ANDROID_CONTROL_ZOOM_RATIO sẽ mang lại các lợi ích trong những trường hợp dưới đây:

  • Phóng to từ ống kính rộng thành ống kính tiêu cự dài: Tỷ lệ dấu phẩy động có độ chính xác cao hơn so với giá trị số 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 hoạ, sau đây là một số tình huống về tỷ lệ thu phóng, vùng cắt và đầu ra khác nhau bằng camera 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 theo vù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 cắt-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)
Hình ảnh cắt trong luồng 640x480: (250, 187, 1500, 1125) (cột hòm thư)
Cắt dòng 1280x720: (0, 187, 2000, 1125) (bằng với vùng cắt)

thu phóng-tỷ lệ-2-cắt-169

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

Tỷ lệ thu phóng: 0,5; Gấp 4 lần 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)
Hình ảnh cắt trong luồng 640x480: (250, 187, 1500, 1125) (ở dạng hòm thư)
Cắt luồng 1280x720: (250, 328, 1500, 844) (có dạng hòm thư)

hình ảnh/thu phóng tỷ lệ-0.5-cắt-11

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

Như đã thấy trong các biểu đồ trên, hệ toạ độ của vùng cắt thay đổi thành trường nhìn sau khi thu phóng 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 này cũng áp dụng cho vùng và khuôn mặt AE/AWB/AF. Thay đổi này trong hệ toạ độ không áp dụng cho Chụp ảnh RAW và siêu dữ liệu liên quan như intrinsicCalibrationlensShadingMap.

Sử dụng cùng một ví dụ giả định ở trên, và giả sử luồng đầu ra #1 (640x480) là có thể đạt được luồng kính ngắm, thu phóng 2.0x bằng 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)

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