Aliran keluaran, Pemangkasan, dan Zoom

Aliran keluaran

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

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

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

Memotong

Pemangkasan susunan piksel penuh (untuk zoom digital dan kasus penggunaan lain yang menginginkan FOV lebih kecil) 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 lancar.

Daerah didefinisikan sebagai persegi panjang (x, y, lebar, tinggi), dengan (x, y) menggambarkan sudut kiri atas persegi panjang tersebut. Persegi panjang ditentukan 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 diperbolehkan dilaporkan oleh HAL melalui bidang info statis ANDROID_SCALER_MAX_DIGITAL_ZOOM, yang menjelaskan faktor zoom maksimum yang didukung. Oleh karena itu, luas dan tinggi minimal daerah tanaman 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 harus memenuhi persyaratan tertentu (misalnya, wilayah tanaman 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. metadata hasil. Demikian pula, jika HAL menerapkan stabilisasi video, HAL harus menyesuaikan wilayah hasil pemotongan 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 crop, dimensi sensor gambar, dan panjang fokus lensa.

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

Dalam semua kasus, tanaman di sungai harus dipusatkan di dalam wilayah tanaman penuh, dan setiap aliran sungai hanya dipotong secara horizontal atau vertikal relatif terhadap wilayah tanaman penuh, tidak boleh 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, berdasarkan hipotesis 3 Sensor MP (susunan 2000 x 1500 piksel).

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

rasio tanaman-wilayah-43

Gambar 1. Rasio aspek 4:3

Wilayah pemangkasan: (500, 375, 1333, 750) (rasio aspek 16:9)
Pangkas aliran 640x480: (666, 375, 1000, 750)
Pemangkasan aliran 1280x720: (500, 375, 1333, 750) (sama dengan wilayah pemangkasan)

rasio wilayah tanaman-169

Gambar 2. Rasio aspek 16:9

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

rasio tanaman-wilayah-11

Gambar 3. Rasio aspek 1:1

Dan contoh terakhir, streaming rasio aspek persegi 1024x1024, bukan streaming 480p:
Wilayah pemangkasan: (500, 375, 1000, 750) (rasio aspek 4:3)
Pangkas aliran 1024x1024: (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 dengan dukungan pemrosesan ulang untuk data RAW Bayer. Dukungan ini memungkinkan pipeline kamera memproses buffer RAW dan metadata yang diambil sebelumnya (keseluruhan frame 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. Daripada menggunakan ANDROID_SCALER_CROP_REGION untuk memotong dan memperbesar, aplikasi dapat menggunakan ANDROID_CONTROL_ZOOM_RATIO untuk mengontrol tingkat zoom, dan menggunakan ANDROID_SCALER_CROP_REGION untuk memotong horizontal dan vertikal guna 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 antar lensa. Penggunaan ANDROID_CONTROL_ZOOM_RATIO memiliki manfaat dalam skenario di bawah:

  • Memperbesar dari lensa lebar ke lensa telefoto: Rasio floating point memberikan presisi yang lebih baik dibandingkan dengan nilai integer ANDROID_SCALER_CROP_REGION .
  • Memperkecil dari lensa lebar ke lensa ultra lebar: ANDROID_CONTROL_ZOOM_RATIO mendukung zoom-out (<1.0f) sedangkan ANDROID_SCALER_CROP_REGION tidak.

Sebagai ilustrasi, berikut adalah beberapa skenario rasio zoom, wilayah pemotongan, dan aliran keluaran yang berbeda, menggunakan kamera hipotetis yang sama yang ditentukan di bagian sebelumnya.

Rasio zoom: 2.0; 1/4 dari bidang pandang asli
Wilayah pemangkasan: (0, 0, 2000, 1500) (rasio aspek 4:3)
Pemangkasan aliran 640x480: (0, 0, 2000, 1500) (sama dengan wilayah pemangkasan)
Pangkas 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 dari bidang pandang asli
Wilayah pemangkasan: (0, 187, 2000, 1125) (rasio aspek 16:9)
Pemotongan aliran 640x480: (250, 187, 1500, 1125) (kotak pilar)
Pemangkasan aliran 1280x720: (0, 187, 2000, 1125) (sama dengan wilayah pemangkasan)

zoom-rasio-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)
Wilayah pemangkasan: (250, 0, 1500, 1500) (rasio aspek 1:1)
Pemotongan aliran 640x480: (250, 187, 1500, 1125) (kotak surat)
Pemotongan streaming 1280x720: (250, 328, 1500, 844) (kotak surat)

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

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

Seperti terlihat dari grafik di atas, sistem koordinat wilayah pemotongan berubah menjadi bidang pandang efektif setelah zoom, 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 terkait seperti intrinsicCalibration dan lensShadingMap .

Dengan 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 berikut:

  • 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 bagian kiri atas bidang pandang jendela bidik, setel android.control.aeRegions ke (0, 0, 1000, 750) dengan android.control.zoomRatio disetel ke 2.0 . Alternatifnya, aplikasi dapat menyetel android.control.aeRegions ke region yang setara dengan (500, 375, 1000, 750) untuk android.control.zoomRatio sebesar 1.0 .