4.17. Pengaturan Sensor¶
Selain pixformat() dan framesize(), kelas CSI mengekspos sejumlah kontrol per-sensor yang hampir setiap aplikasi gunakan cepat atau lambat -- orientasi pemasangan, eksposur, gain, keseimbangan putih, dan beberapa alat bantu debugging. Setiap kontrol memetakan langsung ke konsep sensor yang telah dibahas sebelumnya; API hanya menyediakan pegangan Python untuk penulisan register yang dilakukan driver di bawahnya.
Semua metode di bawah ini bekerja pada sensor yang mendasarinya. Semuanya mendorong penulisan register melalui bus kontrol I2C sensor, sehingga biayanya hanya dalam mikrodetik dan pengaturan baru berlaku pada eksposur berikutnya -- biasanya snapshot() berikutnya.
4.17.1. Orientasi¶
Kamera tidak mengetahui ke arah mana ia dipasang. Dua flag flip yang diterapkan pada sensor membalikkan gambar ke arah yang benar sebelum piksel mana pun meninggalkan chip:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() membalik secara horizontal (kiri-ke-kanan) dan vflip() membalik secara vertikal (atas-ke-bawah). Bersama-sama keduanya mencakup kasus yang muncul dalam praktik: board yang dipasang terbalik (kedua flag True), board di belakang cermin depan yang disepuh perak (hanya hmirror), atau yang melihat pemandangan terpantul dari bawah (hanya vflip).
Karena flip terjadi di logika baca sensor, tidak ada biaya CPU dan tidak ada overhead memori -- bingkai mendarat di framebuffer sudah dalam orientasi yang benar.
4.17.2. Eksposur¶
Eksposur adalah waktu integrasi -- berapa lama fotodioda di setiap piksel mengumpulkan muatan sebelum baris dibaca, dalam mikrodetik. Driver memulai dengan loop auto-eksposur sensor yang berjalan, sehingga kamera mencoba menjaga nilai piksel rata-rata mendekati target. Menonaktifkan loop ini mengunci eksposur ke nilai yang dipilih oleh aplikasi:
csi0.auto_exposure(False, exposure_us=8000)
Eksposur tetap adalah pilihan yang tepat ketika kecerahan pemandangan stabil dan aplikasi memerlukan motion blur yang dapat diprediksi atau intensitas bingkai-ke-bingkai yang konsisten untuk thresholding. Membaca kembali eksposur saat ini -- baik yang diatur oleh loop atau oleh aplikasi -- adalah panggilan terpisah:
us = csi0.exposure_us()
Memanggil auto_exposure() dengan True dan tanpa nilai eksposur mengembalikan kontrol ke loop.
4.17.3. Gain¶
Gain adalah amplifier yang diterapkan pada tegangan piksel sebelum mencapai ADC, dalam desibel. Seperti eksposur, driver memulai dengan loop auto-gain aktif. Dua pola sering muncul. Membatasi batas atas memungkinkan loop beradaptasi dengan pencahayaan tetapi mencegahnya memperkuat noise tanpa batas dalam pemandangan gelap:
csi0.auto_gain(True, gain_db_ceiling=16)
Mengunci gain tetap adalah langkah yang tepat ketika aplikasi juga mengunci eksposur -- stabilitas gain penting untuk aplikasi yang membandingkan nilai piksel bingkai demi bingkai, seperti pelacakan warna:
csi0.auto_gain(False, gain_db=0)
Gain saat ini dapat dibaca melalui gain_db(). Setiap kali aplikasi menonaktifkan auto-gain, ia juga harus menonaktifkan auto-white-balance dan auto-eksposur -- jika tidak, loop kontrol yang masih berjalan akan menarik citra ke berbagai arah yang mengalahkan gain tetap.
4.17.4. Keseimbangan Putih¶
Keseimbangan putih adalah gain per-channel yang diterapkan ISP pada channel merah, hijau, dan biru yang keluar dari tahap debayer sehingga objek putih terlihat putih di bawah cahaya warna apa pun. Loop auto-white-balance menghitung ketiga gain tersebut dari statistik per-wilayah yang dikumpulkan ISP pada setiap bingkai dan menerapkannya pada bingkai berikutnya.
Sebagian besar aplikasi membiarkan loop berjalan. Pelacakan warna adalah pengecualian yang umum -- gain juga adalah apa yang akan didorong loop untuk mengejar objek berwarna, sehingga jika aplikasi mencoba menemukan blob merah, loop akan diam-diam meredupkan channel merah dan blob tidak akan lagi cocok. Mengunci loop memperbaiki itu:
csi0.auto_whitebal(False)
Berikan tuple (r, g, b) eksplisit dalam desibel untuk kalibrasi warna yang dapat diulang -- gain yang sama di semua board dan sesi:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
Gain saat ini dapat dibaca sebagai tuple melalui rgb_gain_db().
4.17.5. Batas Laju Bingkai¶
Sensor berjalan pada laju bingkai aslinya secara default -- 30 hingga 60 bingkai per detik pada sebagian besar komponen, jauh lebih tinggi pada sensor kecepatan tinggi ketika ukuran bingkai cukup kecil. Membatasi laju memungkinkan aplikasi memperlambat kamera sesuai dengan kemampuan pemrosesan hilir:
csi0.framerate(15)
Pada sensor yang mendukung kontrol laju perangkat keras, panggilan ini juga memperpanjang anggaran eksposur per-bingkai, yang dapat membantu dalam kondisi cahaya rendah; pada sensor lainnya, driver hanya melewati bingkai ekstra di tingkat framebuffer.
4.17.6. Pola Uji¶
Pola uji colour-bar sudah terpasang di sebagian besar sensor dan berguna untuk memisahkan masalah pencitraan dari masalah output. Mengaktifkannya melewati array fotodioda dan mengirimkan pola tetap melalui jalur data piksel yang sama:
csi0.colorbar(True)
Jika pola uji terlihat benar tetapi citra langsung tidak, kesalahannya ada di optik atau bagian analog front-end sensor; jika bahkan pola uji pun rusak, masalahnya ada di suatu tempat pada bus data piksel atau dalam konfigurasi pixformat() / framesize(). Berikan False untuk kembali ke citra langsung.
Lihat csi.CSI untuk API lengkap, termasuk perintah ioctl() khusus sensor yang mengekspos kontrol unik untuk keluarga sensor tertentu.