Streaming output, pemangkasan, dan zoom

Aliran output

Subsistem kamera hanya beroperasi pada pipeline berbasis ANativeWindow untuk semua resolusi dan format output. Beberapa streaming dapat dikonfigurasi di satu kali mengirim satu frame ke banyak target seperti GPU, video encoder, RenderScript, atau buffer yang terlihat oleh aplikasi (RAW Bayer, YUV yang diproses buffer berenkode JPEG).

Sebagai pengoptimalan, streaming output ini harus dikonfigurasi terlebih dahulu, dan hanya boleh ada jumlah terbatas yang akan dibuat sekaligus. Hal ini memungkinkan pra-alokasi {i>buffer<i} memori dan konfigurasi perangkat keras kamera, sehingga ketika permintaan dikirimkan dengan beberapa atau berbagai pipeline output yang terdaftar, tidak akan penundaan atau latensi dalam memenuhi permintaan.

Untuk mengetahui informasi lebih lanjut tentang kombinasi output streaming terjamin yang tergantung pada tingkat perangkat keras yang didukung, lihat createCaptureSession().

Memotong

Pemangkasan larik piksel penuh (untuk zoom digital dan kasus penggunaan lain di mana FOV yang lebih kecil diinginkan) dikomunikasikan melalui ANDROID_SCALER_CROP_REGION deskripsi tempat. Ini adalah setelan per permintaan, dan dapat berubah berdasarkan permintaan, yang penting untuk implementasi zoom digital yang lancar.

Area didefinisikan sebagai persegi panjang (x, y, lebar, tinggi), dengan (x, y) yang menjelaskan sudut kiri atas persegi panjang. Persegi panjang didefinisikan pada dari array piksel aktif sensor, dengan (0,0) adalah nilai piksel kiri atas dari array piksel aktif. Oleh karena itu, lebar dan tinggi tidak boleh lebih besar dari dimensi yang dilaporkan dalam ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY {i>static info <i}(info statis). Lebar dan tinggi minimum yang diizinkan dilaporkan oleh HAL melalui bidang info statis ANDROID_SCALER_MAX_DIGITAL_ZOOM, yang menjelaskan faktor zoom maksimum yang didukung. Oleh karena itu, lebar area pemangkasan minimum dan tingginya adalah:

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

Jika wilayah pangkalan perlu memenuhi persyaratan tertentu (misalnya, perlu untuk memulai koordinat yang genap, dan lebar/tingginya harus genap), HAL harus melakukan pembulatan yang diperlukan dan menuliskan wilayah pemangkasan akhir yang digunakan dalam metadata hasil output. Demikian pula, jika HAL menerapkan stabilisasi video, harus menyesuaikan area pemangkasan hasil untuk mendeskripsikan wilayah yang sebenarnya disertakan dalam output setelah stabilisasi video diterapkan. Secara umum, model aplikasi harus dapat menentukan ruang pandang yang diterimanya berdasarkan area pemangkasan, dimensi sensor gambar, dan panjang fokus lensa.

Karena wilayah pangkas berlaku untuk semua aliran data, yang mungkin memiliki aspek berbeda daripada area pemangkasan, area sensor yang tepat yang digunakan untuk setiap aliran mungkin lebih kecil dari area pemangkasan. Secara khusus, setiap aliran data harus mempertahankan piksel dan rasio aspeknya dengan memangkas lebih sedikit pemangkasan yang ditentukan teritorial Anda. Jika rasio aspek streaming lebih lebar dari area pemangkasan, streaming harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek streaming lebih sempit dari area pangkas, aliran harus dipangkas lebih lanjut secara horizontal.

Dalam semua kasus, pemangkasan aliran harus dipusatkan dalam area pemangkasan penuh, dan setiap streaming hanya dipangkas secara horizontal atau vertikal sesuai dengan wilayah pangkas, bukan keduanya.

Misalnya, jika dua streaming ditentukan, streaming 640x480 (aspek 4:3), dan Streaming 1280x720 (aspek 16:9), di bawah ini menunjukkan region output yang diharapkan untuk setiap aliran data untuk beberapa wilayah tanaman sampel, dengan resolusi 3 MP (2000 x sensor (array 1500 piksel).

Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Crop aliran 640x480: (500, 375, 1000, 750) (sama dengan wilayah pangkas)
Crop stream 1280x720: (500, 469, 1000, 562)

rasio crop-region-43

Gambar 1. Rasio aspek 4:3

Wilayah pangkas: (500, 375, 1333, 750) (rasio aspek 16:9)
Crop stream 640x480: (666, 375, 1000, 750)
Crop stream 1280x720: (500, 375, 1333, 750) (sama dengan wilayah pemangkasan)

pemangkasan-region-169-rasio

Gambar 2. Rasio lebar tinggi 16:9

Wilayah pangkas: (500, 375, 750, 750) (rasio aspek 1:1)
Crop stream 640x480: (500, 469, 750, 562)
Crop stream 1280x720: (500, 543, 750, 414)

rasio crop-region-11

Gambar 3. Rasio aspek 1:1

Dan contoh terakhir, streaming rasio aspek persegi 1024x1024, bukan 480p feed:
Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Crop feed 1024x1024: (625, 375, 750, 750)
Crop stream 1280x720: (500, 469, 1000, 562)

wilayah pangkas-43 rasio persegi

Gambar 4. Rasio aspek 4:3, persegi

Memproses ulang

Dukungan tambahan untuk file gambar mentah diberikan dengan dukungan pemrosesan ulang untuk RAW Bayer layanan otomatis dan data skalabel. Dukungan ini memungkinkan pipeline kamera untuk memproses rekaman Buffering RAW dan metadata (seluruh frame yang direkam sebelumnya), untuk menghasilkan output YUV atau JPEG baru yang dirender.

Zoom

Untuk perangkat yang menjalankan Android 11 atau yang lebih baru, aplikasi dapat menggunakan zoom kamera (digital dan optik) melalui setelan ANDROID_CONTROL_ZOOM_RATIO.

Rasio zoom ditentukan sebagai faktor floating point. Daripada fokus pada menggunakan ANDROID_SCALER_CROP_REGION untuk memangkas dan melakukan zoom, aplikasi dapat menggunakan ANDROID_CONTROL_ZOOM_RATIO untuk mengontrol tingkat zoom dan menggunakan ANDROID_SCALER_CROP_REGION untuk pemangkasan horizontal dan vertikal ke mencapai rasio aspek yang berbeda dari sensor kamera native.

Sistem multi-kamera dapat berisi lebih dari satu lensa dengan panjang fokus, dan pengguna dapat menggunakan zoom optik dengan beralih di antara lensa. Penggunaan ANDROID_CONTROL_ZOOM_RATIO memiliki beberapa manfaat dalam skenario di bawah:

  • Memperbesar dari lensa lebar ke lensa telefoto: Rasio floating point memberikan presisi yang lebih baik dibandingkan dengan ANDROID_SCALER_CROP_REGION.
  • Memperkecil dari lensa lebar ke lensa ultrawide: ANDROID_CONTROL_ZOOM_RATIO mendukung perkecil (<1.0f) sedangkan ANDROID_SCALER_CROP_REGION tidak.

Sebagai ilustrasi, berikut ini beberapa skenario rasio zoom, wilayah pemangkasan, dan output yang berbeda streaming, menggunakan kamera hipotesis yang sama yang ditentukan di bagian sebelumnya.

Rasio zoom: 2,0; 1/4 ruang pandang asli
Wilayah pangkas: (0, 0, 2000, 1500) (rasio aspek 4:3)
Crop aliran 640x480: (0, 0, 2000, 1500) (sama dengan wilayah pangkas)
Crop aliran 1280x720: (0, 187, 2000, 1125)

zoom-rasio-2-pangkas-43

Gambar 5. Zoom 2,0, rasio aspek 4:3

Rasio zoom: 2,0; 1/4 ruang pandang asli
Wilayah pangkas: (0, 187, 2000, 1125) (rasio aspek 16:9)
Crop stream 640x480: (250, 187, 1500, 1125) (tampilan tinggi)
Crop stream 1280x720: (0, 187, 2000, 1125) (sama dengan wilayah panen)

zoom-rasio-2-pangkas-169

Gambar 6. Zoom 2,0, rasio aspek 16:9

Rasio zoom: 0,5; 4x ruang pandang asli (dialihkan dari lensa lebar ke lensa ultrawide)
Wilayah pangkas: (250, 0, 1500, 1500) (rasio aspek 1:1)
Crop stream 640x480: (250, 187, 1500, 1125) (tampilan lebar)
Crop stream 1280x720: (250, 328, 1500, 844) (tampilan lebar)

gambar/zoom-ratio-0.5-crop-11

Gambar 7. Zoom 0,5, rasio aspek 1:1

Seperti yang terlihat dari grafik di atas, sistem koordinat wilayah pangkalan berubah menjadi setelah zoom, dan direpresentasikan oleh persegi panjang dengan dimensi berikut: (0, 0, activeArrayWith, activeArrayHeight). Hal yang sama berlaku untuk area dan wajah AE/AWB/AF. Perubahan sistem koordinat ini tidak berlaku untuk Rekaman RAW dan metadata terkaitnya, seperti intrinsicCalibration dan lensShadingMap.

Menggunakan contoh hipotesis yang sama di atas, dan dengan asumsi aliran output #1 (640x480) adalah streaming jendela bidik, zoom 2,0x dapat dicapai dengan salah satu dari dua cara berikut:

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (default), scaler.cropRegion = (500, 375, 1000, 750)

Untuk aplikasi agar menyetel android.control.aeRegions ke kiri atas seperempat ruang pandang jendela bidik, disetel android.control.aeRegions ke (0, 0, 1000, 750) dengan android.control.zoomRatio disetel ke 2.0. Sebagai alternatif, aplikasi dapat menetapkan android.control.aeRegions ke nilai yang setara wilayah (500, 375, 1000, 750) untuk android.control.zoomRatio dari 1.0.