Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Output stream, Cropping, dan Zoom

Aliran keluaran

Subsistem kamera beroperasi hanya pada pipeline berbasis ANativeWindow untuk semua resolusi dan format keluaran. Beberapa aliran dapat dikonfigurasi sekaligus untuk mengirim satu frame ke banyak target seperti GPU, encoder video, RenderScript , atau buffer yang terlihat aplikasi (RAW Bayer, buffer YUV yang diproses, atau buffer yang dienkode 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 dikirimkan dengan beberapa atau berbagai pipeline output yang terdaftar, tidak akan ada penundaan atau latensi dalam memenuhi permintaan.

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

Memangkas

Pemotongan larik piksel penuh (untuk zoom digital dan kasus penggunaan lain yang menginginkan FOV yang lebih kecil) dikomunikasikan melalui setelan 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 dalam 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 daerah 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 khusus (misalnya, harus dimulai pada koordinat genap, dan lebar / tinggi harus genap), HAL harus melakukan pembulatan yang diperlukan dan menuliskan wilayah tanaman akhir yang digunakan dalam output metadata hasil. Demikian pula, jika HAL mengimplementasikan stabilisasi video, HAL harus menyesuaikan wilayah krop hasil untuk mendeskripsikan wilayah yang sebenarnya termasuk dalam keluaran 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 pemangkasan berlaku untuk semua aliran, yang mungkin memiliki rasio aspek berbeda dari wilayah pemangkasan, wilayah sensor yang tepat yang digunakan untuk setiap aliran mungkin lebih kecil daripada wilayah pemangkasan. Secara khusus, setiap aliran harus mempertahankan piksel persegi dan rasio aspeknya dengan memangkas lebih jauh wilayah pemangkasan yang ditentukan. Jika rasio aspek aliran lebih lebar dari wilayah pemangkasan, aliran harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek aliran lebih sempit dari wilayah pemangkasan, aliran harus dipangkas lebih lanjut secara horizontal.

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

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

tanaman-wilayah-43-rasio

Gambar 1. Rasio aspek 4: 3

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

tanaman-wilayah-169-rasio

Gambar 2. Rasio aspek 16: 9

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

tanaman-wilayah-11-rasio

Gambar 3. Rasio aspek 1: 1

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

tanaman-wilayah-43-persegi-rasio

Gambar 4. Rasio aspek 4: 3, persegi

Pemrosesan ulang

Dukungan tambahan untuk file gambar mentah disediakan dengan memproses ulang dukungan untuk data RAW Bayer. Dukungan ini memungkinkan pipeline kamera memproses buffer RAW dan metadata yang diambil sebelumnya (seluruh bingkai yang direkam sebelumnya), untuk menghasilkan keluaran 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 titik mengambang. Alih-alih 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 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 antar lensa. Menggunakan ANDROID_CONTROL_ZOOM_RATIO memiliki keuntungan 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 mengilustrasikan, berikut adalah beberapa skenario rasio zoom, daerah krop, dan aliran keluaran yang berbeda, menggunakan kamera hipotetis yang sama yang dijelaskan di bagian sebelumnya.

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

zoom-rasio-2-krop-43

Gambar 5. Zoom 2.0, rasio aspek 4: 3

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

zoom-rasio-2-potong-169

Gambar 6. Zoom 2.0, rasio aspek 16: 9

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

gambar / rasio zoom-0,5-potong-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 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 terkaitnya seperti intrinsicCalibration dan lensShadingMap .

Menggunakan contoh hipotesis 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 tampilan jendela bidik, setel android.control.aeRegions ke (0, 0, 1000, 750) dengan android.control.zoomRatio disetel ke 2.0 . Atau, aplikasi bisa menyetel android.control.aeRegions ke region yang setara dengan (500, 375, 1000, 750) untuk android.control.zoomRatio 1.0 .