4.18. Beberapa sensor

Sejumlah OpenMV Cam memasangkan dua sensor citra di papan yang sama -- paling umum kamera warna bersama sensor termal FLIR® Lepton®, tetapi bentuk yang sama berlaku untuk board warna-plus-event dan perangkat keras dual-sensor di masa depan. Setiap sensor memiliki array pikselnya sendiri, bus kontrolnya sendiri, dan menjalankan pipeline-nya sendiri pada frame rate-nya sendiri. API CSI diperluas untuk mencakupnya dengan memungkinkan aplikasi menginstansiasi satu objek CSI per sensor fisik.

4.18.1. Memilih sensor yang digunakan

Konstruktor CSI menerima argumen cid yang menamai sensor tertentu di board. cid=-1 (default) memilih sensor utama; konstanta cid yang diberi nama memilih sekunder berdasarkan chip ID:

import csi

csi_rgb     = csi.CSI()                    # primary colour sensor
csi_thermal = csi.CSI(cid=csi.LEPTON)      # FLIR® Lepton®

Setiap instans memiliki konfigurasinya sendiri -- format piksel, framesize, knob eksposur / gain, pool framebuffer -- dan di-reset, dikonfigurasi, serta dibaca secara independen dari yang lain. Konstanta untuk sensor sekunder yang didukung (LEPTON, GENX320, dan yang lainnya tercantum dalam referensi CSI) menamai chip yang diharapkan oleh aplikasi pada port sekunder; driver gagal dalam konstruksi jika chip sebenarnya tidak cocok.

4.18.2. Menangkap dari kedua sensor

Setiap sensor menjalankan pipeline penangkapannya secara independen dari yang lain -- sensor warna mungkin mengirimkan tiga puluh bingkai per detik sementara Lepton® mengirimkan sembilan. Cara langsung untuk menangani ketidakcocokan tersebut adalah membiarkan sensor yang lebih cepat menggerakkan loop dan membaca sensor yang lebih lambat secara non-blocking, mengambil apapun yang siap dan melewati iterasi saat tidak ada apapun:

import csi

csi_rgb     = csi.CSI()
csi_thermal = csi.CSI(cid=csi.LEPTON)

csi_rgb.reset()                        # powers the rail, pulses RESET
csi_rgb.pixformat(csi.RGB565)
csi_rgb.framesize(csi.QVGA)

csi_thermal.reset(hard=False)          # I2C reconfigure only
csi_thermal.pixformat(csi.GRAYSCALE)
csi_thermal.framesize(csi.QQVGA)

while True:
    rgb_img     = csi_rgb.snapshot()                  # blocks for next colour frame
    thermal_img = csi_thermal.snapshot(blocking=False)  # returns None if not ready
    if thermal_img is not None:
        # process aligned colour + thermal pair
        pass
    else:
        # process colour only on this iteration
        pass

snapshot() yang blocking mengatur tempo loop; yang non-blocking mengembalikan bingkai termal terbaru ketika ada yang baru tiba sejak panggilan sebelumnya, dan None jika tidak. Aplikasi terus berjalan pada frame rate sensor warna dan mendapatkan bingkai termal setiap kali Lepton® menghasilkannya.

Pola sebaliknya -- dua snapshot blocking back to back -- juga berfungsi, tetapi loop kemudian berjalan pada kecepatan lebih lambat dari dua sensor, dengan pipeline sensor yang lebih cepat terhenti di antara iterasi. Pilih kecepatan mana yang sebenarnya ingin digunakan oleh pemrosesan hilir aplikasi.

4.18.3. Reset pada jalur daya bersama

Beberapa board dual-sensor menjalankan kedua chip dari satu jalur daya atau berbagi saluran reset. Pada board tersebut, reset() pertama membawa jalur naik dan memberikan sinyal bersama; reset berikutnya pada instans CSI lainnya harus mengoper hard=False sehingga mereka hanya memprogram ulang chip mereka sendiri tanpa menyeret tetangga melalui reset:

csi_rgb.reset()                        # primary -- powers the rail, pulses RESET
csi_thermal.reset(hard=False)          # secondary -- I2C reconfigure only

hard=True pada sekunder dalam bentuk ini akan me-reset ulang yang utama sebagai efek samping, membatalkan penyiapan yang sudah didorong oleh aplikasi. Halaman referensi untuk setiap board dual-sensor menjelaskan apakah jalurnya bersama.

4.18.4. Memilih sumber stream

Kamera dengan dua sensor memiliki dua instans CSI tetapi tetap hanya satu framebuffer stream di antara keduanya. Argumen konstruktor memilih bingkai sensor mana yang dikirim ke pratinjau:

csi_rgb     = csi.CSI()                    # primary
csi_thermal = csi.CSI(cid=csi.LEPTON,
                      stream=True)         # preview source

stream=True menjadikan instans yang diberi nama sebagai sumber. Tanpa argumen stream=, sensor utama (cid=-1, default) adalah sumbernya; instans yang dibangun dengan cid= sensor sekunder tetap diam pada pratinjau kecuali stream=True diteruskan secara eksplisit. Panggilan ke snapshot() pada sensor yang tidak dipilih masih menangkap bingkai ke framebuffer sensor tersebut secara normal -- mereka hanya tidak memperbarui pratinjau.