Aliran keluaran, Pemotongan, dan Zoom

Aliran keluaran

Subsistem kamera hanya beroperasi pada saluran berbasis ANativeWindow untuk semua resolusi dan format output. Beberapa aliran dapat dikonfigurasi pada satu waktu untuk mengirim satu bingkai ke banyak target seperti GPU, encoder video, RenderScript , atau buffer yang terlihat oleh aplikasi (RAW Bayer, buffer YUV yang diproses, atau buffer dengan enkode JPEG).

Sebagai pengoptimalan, aliran keluaran ini harus dikonfigurasi sebelumnya, dan hanya sejumlah terbatas yang mungkin ada sekaligus. Hal ini memungkinkan pra-alokasi buffer memori dan konfigurasi perangkat keras kamera, sehingga ketika permintaan diajukan dengan beberapa atau beragam jalur pipa keluaran yang terdaftar, tidak akan ada penundaan atau latensi dalam memenuhi permintaan.

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

Memotong

Pemotongan susunan piksel penuh (untuk zoom digital dan kasus penggunaan lain di mana FOV yang lebih kecil diinginkan) dikomunikasikan melalui pengaturan ANDROID_SCALER_CROP_REGION. Ini adalah pengaturan per permintaan, dan dapat berubah berdasarkan permintaan, yang sangat penting untuk menerapkan zoom digital yang mulus.

Daerah didefinisikan sebagai persegi panjang (x, y, lebar, tinggi), dengan (x, y) menggambarkan sudut kiri atas persegi panjang. Persegi panjang didefinisikan pada sistem koordinat larik piksel aktif sensor, dengan (0,0) menjadi piksel kiri atas larik piksel aktif. Oleh karena itu, lebar dan tinggi tidak boleh lebih besar dari dimensi yang dilaporkan di bidang info statis ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. 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 dan tinggi wilayah tanaman minimum 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 tanaman perlu memenuhi persyaratan tertentu (misalnya, harus dimulai pada koordinat genap, dan lebar/tingginya harus genap), HAL harus melakukan pembulatan yang diperlukan dan menuliskan wilayah tanaman akhir yang digunakan dalam output. hasil metadata. Demikian pula, jika HAL mengimplementasikan stabilisasi video, ia harus menyesuaikan wilayah hasil krop untuk menggambarkan wilayah yang sebenarnya disertakan dalam output setelah stabilisasi video diterapkan. Secara umum, aplikasi yang menggunakan kamera harus dapat menentukan bidang pandang yang diterimanya berdasarkan wilayah krop, dimensi sensor gambar, dan panjang fokus lensa.

Karena wilayah krop berlaku untuk semua aliran, yang mungkin memiliki rasio aspek berbeda dari wilayah krop, wilayah sensor yang tepat yang digunakan untuk setiap aliran mungkin lebih kecil daripada wilayah krop. Secara khusus, setiap aliran harus mempertahankan piksel persegi dan rasio aspeknya dengan memangkas lebih lanjut wilayah tanaman yang ditentukan. Jika rasio aspek aliran lebih lebar dari wilayah tanaman, aliran harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek aliran lebih sempit daripada wilayah tanaman, aliran harus dipotong lebih lanjut secara horizontal.

Dalam semua kasus, tanaman aliran harus dipusatkan di dalam wilayah panen penuh, dan setiap aliran hanya dipotong secara horizontal atau vertikal relatif terhadap wilayah panen penuh, tidak pernah keduanya.

Misalnya, jika dua aliran ditentukan, aliran 640x480 (aspek 4:3), dan aliran 1280x720 (aspek 16:9), di bawah ini menunjukkan wilayah keluaran yang diharapkan untuk setiap aliran untuk beberapa wilayah tanaman sampel, pada 3 hipotetis Sensor MP (2000 x 1500 piksel).

Pangkas wilayah: (500, 375, 1000, 750) (rasio aspek 4:3)
640x480 tanaman aliran: (500, 375, 1000, 750) (sama dengan wilayah tanaman)
Pangkas aliran 1280x720: (500, 469, 1000, 562)

rasio tanaman-wilayah-43

Gambar 1. Rasio aspek 4:3

Pangkas wilayah: (500, 375, 1333, 750) (rasio aspek 16:9)
tanaman aliran 640x480: (666, 375, 1000, 750)
1280x720 stream crop: (500, 375, 1333, 750) (sama dengan wilayah crop)

crop-region-169-rasio

Gambar 2. Rasio aspek 16:9

Pangkas wilayah: (500, 375, 750, 750) (rasio aspek 1:1)
640x480 tanaman aliran: (500, 469, 750, 562)
Pangkas aliran 1280x720: (500, 543, 750, 414)

crop-region-11-rasio

Gambar 3. Rasio aspek 1:1

Dan contoh terakhir, aliran rasio aspek persegi 1024x1024 alih-alih aliran 480p:
Pangkas wilayah: (500, 375, 1000, 750) (rasio aspek 4:3)
1024x1024 aliran tanaman: (625, 375, 750, 750)
Pangkas aliran 1280x720: (500, 469, 1000, 562)

rasio tanaman-wilayah-43-persegi

Gambar 4. Rasio aspek 4:3, persegi

Pemrosesan ulang

Dukungan tambahan untuk file gambar mentah disediakan oleh dukungan pemrosesan ulang untuk data RAW Bayer. Dukungan ini memungkinkan saluran kamera untuk memproses buffer dan metadata RAW yang diambil sebelumnya (seluruh bingkai yang direkam sebelumnya), untuk menghasilkan output YUV atau JPEG baru yang dirender.

Perbesar

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

Rasio zoom didefinisikan sebagai faktor floating point. Alih-alih menggunakan ANDROID_SCALER_CROP_REGION untuk memotong dan memperbesar, aplikasi dapat menggunakan ANDROID_CONTROL_ZOOM_RATIO untuk mengontrol tingkat pembesaran, dan menggunakan ANDROID_SCALER_CROP_REGION untuk pemotongan horizontal dan vertikal untuk mencapai rasio aspek yang berbeda dari sensor kamera asli.

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

  • Memperbesar dari lensa lebar ke lensa telefoto: Rasio titik mengambang memberikan presisi yang lebih baik dibandingkan dengan nilai bilangan bulat ANDROID_SCALER_CROP_REGION .
  • Memperkecil dari lensa lebar ke lensa ultrawide: ANDROID_CONTROL_ZOOM_RATIO mendukung zoom-out (<1.0f) sedangkan ANDROID_SCALER_CROP_REGION tidak.

Untuk mengilustrasikannya, berikut adalah beberapa skenario rasio zoom, wilayah krop, dan aliran keluaran yang berbeda, menggunakan kamera hipotetis yang sama yang ditentukan di bagian sebelumnya.

Rasio zoom: 2.0; 1/4 bidang pandang asli
Pangkas wilayah: (0, 0, 2000, 1500) (rasio aspek 4:3)
640x480 tanaman aliran: (0, 0, 2000, 1500) (sama dengan wilayah tanaman)
Pangkas aliran 1280x720: (0, 187, 2000, 1125)

rasio zoom-2-pangkas-43

Gambar 5. Zoom 2.0, rasio aspek 4:3

Rasio zoom: 2.0; 1/4 bidang pandang asli
Pangkas wilayah: (0, 187, 2000, 1125) (rasio aspek 16:9)
640x480 tanaman aliran: (250, 187, 1500, 1125) (kotak pilar)
1280x720 stream crop: (0, 187, 2000, 1125) (sama dengan wilayah crop)

rasio-zoom-2-pangkas-169

Gambar 6. Zoom 2.0, rasio aspek 16:9

Rasio zoom: 0,5; 4x bidang pandang asli (beralih dari lensa lebar ke lensa ultrawide)
Pangkas wilayah: (250, 0, 1500, 1500) (rasio tinggi lebar 1:1)
640x480 tanaman aliran: (250, 187, 1500, 1125) (kotak surat)
Pangkas aliran 1280x720: (250, 328, 1500, 844) (kotak surat)

gambar/rasio-zoom-0,5-pangkas-11

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

Seperti yang terlihat dari grafik di atas, sistem koordinat wilayah krop berubah menjadi bidang pandang after-zoom efektif, dan diwakili oleh persegi panjang dengan dimensi berikut: ( 0 , 0 , activeArrayWith , activeArrayHeight ). Hal yang sama berlaku untuk wilayah dan wajah AE/AWB/AF. Perubahan sistem koordinat ini tidak berlaku untuk pengambilan RAW dan metadata terkaitnya seperti intrinsicCalibration dan lensShadingMap .

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

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

Agar aplikasi menyetel android.control.aeRegions menjadi seperempat kiri atas bidang pandang jendela bidik, setel android.control.aeRegions ke (0, 0, 1000, 750) dengan android.control.zoomRatio disetel ke 2.0 . Atau, aplikasi dapat menyetel android.control.aeRegions ke region yang setara (500, 375, 1000, 750) untuk android.control.zoomRatio 1.0 .