Multispectral Thermal (OV5640)

Varian OV5640 dari Modul Kamera Multispektral Termal memadukan sensor warna rolling-shutter 5MP dengan inti termal FLIR Lepton, sehingga OpenMV Cam dapat menjalankan pipeline visi warna resolusi tinggi dan termal secara bersamaan.

Multispectral Thermal (OV5640)

Untuk datasheet lengkap, foto, dan pemesanan lihat halaman produk Multispectral Thermal.

Catatan

Hanya didukung pada OpenMV Cam RT1062.

Fitur Unggulan

  • OV5640: rolling shutter 5MP untuk warna resolusi lebih tinggi

  • Mendukung inti termal FLIR Lepton 1.x / 2.x / 3.x

  • Pemrosesan termal + warna secara bersamaan dalam satu modul

  • Dapat melihat dalam kegelapan total, mendukung pengukuran suhu

  • Autofocus dan apertur F2.0 pada sensor warna

Penggunaan

Sensor warna dan FLIR Lepton masing-masing mendapatkan instans csi.CSI sendiri. Pemanggilan pertama menggunakan sensor utama (OV5640) secara default; pemanggilan kedua mengikat ke Lepton dengan meneruskan cid= csi.LEPTON. Reset keras sensor warna dengan csi.CSI.reset (hard=True) untuk menghidupkan rail, dan konfigurasikan Lepton dengan hard=False agar driver-nya hanya memprogram ulang chip tanpa me-toggle reset kembali.

csi.CSI.framesize ( csi.QVGA ) mencocokkan output Lepton dengan kamera warna, sehingga setiap snapshot() mengembalikan bingkai 320x240. Driver Lepton secara internal memperbesar bingkai aslinya yang berukuran 80x60 (1.x/2.x) atau 160x120 (3.x) ke ukuran yang diminta — pada QVGA setiap piksel Lepton mencakup sel 4x4 atau 2x2 pada bingkai warna.

Dua buffer sementara tetap konstan sepanjang loop bingkai — palette alpha 256x1 yang tersimpan sebagai image.Image sehingga piksel Lepton yang dingin menjadi transparan dan piksel panas menjadi buram (ramp kuadratik menekan detail latar belakang tanpa menghancurkan rentang menengah), dan buffer bingkai Lepton yang dialokasikan sebelumnya dengan image.Image sehingga csi.CSI.snapshot (blocking=False, image=...) dapat mengisinya di tempat pada setiap iterasi tanpa mengalokasikan ulang:

import time
import csi
import image
import math

alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
    alpha_pal[i] = int(math.pow((i / 255), 2) * 255)

# Setup the color camera sensor.
csi0 = csi.CSI()
csi0.reset(hard=True)  # force hardware reset.
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False)  # no hardware reset - just configure lepton
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QVGA)

# Optional temperature range controls for the LEPTON.
# csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
# csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)

clock = time.clock()

img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())

while True:
    clock.tick()
    img0 = csi0.snapshot()
    csi1.snapshot(blocking=False, image=img1)
    img0.draw_image(img1, 0, 0, color_palette=image.PALETTE_IRONBOW,
                    alpha_palette=alpha_pal,
                    hint=image.BILINEAR)
    print(clock.fps())

Setiap iterasi mengambil snapshot warna secara blocking dan snapshot Lepton secara non-blocking — Lepton berjalan pada 9 Hz sehingga blocking pada Lepton akan memperlambat pipeline warna. Image.draw_image kemudian menggabungkan keduanya: color_palette= image.PALETTE_IRONBOW memetakan skala abu-abu Lepton ke ramp warna hangat bergaya FLIR, alpha_palette= memadukan setiap piksel menggunakan peta alpha kuadratik, dan hint= image.BILINEAR memperhalus pembesaran.

OV5640 memiliki lensa autofocus dengan aktuator kumparan suara. Picu satu kali putaran autofocus pada kamera warna melalui csi.CSI.ioctl dengan csi.IOCTL_TRIGGER_AUTO_FOCUS — sensor menyapu motor fokus sekali dan mengunci pada objek yang ada di depannya:

csi0.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)

Kirim ulang ioctl setiap kali pemandangan berubah — autofocus bersifat satu kali tembak, bukan kontinu.

Pengukuran Suhu

Lepton radiometrik (Lepton 2.5 / 3.5) melaporkan data suhu per piksel yang terkalibrasi. Aktifkan mode pengukuran melalui csi.CSI.ioctl dengan csi.IOCTL_LEPTON_SET_MODE, lalu batasi jendela suhu dengan csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Driver Lepton memetakan nilai piksel skala abu-abu 0 ke min_celsius dan 255 ke max_celsius secara linier, sehingga setiap piksel menjadi pencarian suhu dalam jendela yang dikonfigurasi. Piksel yang lebih dingin dari min_celsius jenuh di 0, piksel yang lebih panas dari max_celsius jenuh di 255.

csi.IOCTL_LEPTON_SET_MODE menerima dua flag. Yang pertama mengaktifkan pengukuran; yang kedua memilih rentang suhu sensor:

  • Rentang rendah(True, False) — rentang sensor -10 °C hingga +140 °C (pemandangan skala ruangan). Batasi jendela ke area yang diminati, misalnya (20.0, 40.0) untuk pelacakan panas tubuh:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Rentang tinggi(True, True) — rentang sensor -10 °C hingga ~+450 °C tipikal (~+400 °C pada suhu ruangan) untuk objek panas. Batasi ke misalnya (0.0, 400.0) untuk pelacakan tungku atau elemen panas:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 0.0, 400.0)
    

Untuk mengkonversi piksel skala abu-abu kembali ke Celsius:

def p_to_temp(p, min_t, max_t):
    return (p * (max_t - min_t)) / 255.0 + min_t

Ini bekerja pada piksel individual atau pada statistik agregat (misalnya stats.mean() dari Image.get_statistics) di dalam ROI saat menentukan lokasi wilayah panas/dingin dengan Image.find_blobs.