Multispectral Thermal (OV5640)¶
Varianta OV5640 a modulului de cameră Multispectral Thermal combină un senzor color cu obturator rulant de 5MP cu un nucleu termic FLIR Lepton, astfel încât camera OpenMV Cam poate rula simultan fluxuri de viziune color de înaltă rezoluție și fluxuri termice.
Pentru fișa tehnică completă, fotografii și comenzi, consultați pagina de produs Multispectral Thermal.
Notă
Acceptat doar pe OpenMV Cam RT1062.
Aspecte principale¶
OV5640: obturator rulant de 5MP pentru culoare de rezoluție mai mare
Acceptă nuclee termice FLIR Lepton 1.x / 2.x / 3.x
Procesare termică + color simultană pe un singur modul
Vede în întuneric total, acceptă măsurarea temperaturii
Autofocus și diafragmă F2.0 pe senzorul color
Utilizare¶
Senzorul color și FLIR Lepton primesc fiecare propria instanță csi.CSI. Primul apel folosește în mod implicit senzorul principal (OV5640); al doilea se leagă de Lepton prin transmiterea cid= csi.LEPTON. Resetați hardware senzorul color cu csi.CSI.reset (hard=True) pentru a alimenta linia, și configurați Lepton cu hard=False astfel încât driverul său doar să reprogrameze cipul fără a reactiva resetarea.
csi.CSI.framesize ( csi.QVGA ) potrivește ieșirea Lepton cu camera color, astfel încât fiecare snapshot() returnează un cadru de 320x240. Driverul Lepton mărește intern cadrul său nativ de 80x60 (1.x/2.x) sau 160x120 (3.x) la dimensiunea cerută — la QVGA fiecare pixel Lepton acoperă o celulă de 4x4 sau 2x2 pe cadrul color.
Două tampoane de lucru rămân constante pe parcursul buclei de cadre — o paletă alfa de 256x1 stocată ca image.Image astfel încât pixelii Lepton reci devin transparenți iar pixelii fierbinți devin opaci (rampa pătratică suprimă detaliile de fundal fără a strivi gama de mijloc), și un tampon de cadre Lepton pre-alocat cu image.Image astfel încât csi.CSI.snapshot (blocking=False, image=...) îl poate umple pe loc la fiecare iterație fără realocare:
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())
Fiecare iterație preia un instantaneu color blocant și un instantaneu Lepton neblocant — Lepton rulează la 9 Hz, deci blocarea pe el ar limita fluxul color. Image.draw_image apoi le compune pe cele două: color_palette= image.PALETTE_IRONBOW mapează tonurile de gri ale Lepton la o rampă de culoare caldă în stil FLIR, alpha_palette= amestecă fiecare pixel folosind harta alfa pătratică, iar hint= image.BILINEAR netezește mărirea.
OV5640 are o lentilă cu autofocus acționată de bobină mobilă. Declanșați o singură trecere de autofocus pe camera color prin csi.CSI.ioctl cu csi.IOCTL_TRIGGER_AUTO_FOCUS — senzorul baleiază motorul de focalizare o dată și se fixează pe orice se află în fața lui:
csi0.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Reemiteți ioctl-ul ori de câte ori se schimbă scena — autofocusul este unic, nu continuu.
Măsurarea temperaturii¶
Modulele Lepton radiometrice (Lepton 2.5 / 3.5) raportează date de temperatură calibrate pentru fiecare pixel. Activați modul de măsurare prin csi.CSI.ioctl cu csi.IOCTL_LEPTON_SET_MODE, apoi limitați fereastra de temperatură cu csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Driverul Lepton mapează liniar valoarea pixelului în tonuri de gri 0 la min_celsius și 255 la max_celsius, astfel încât fiecare pixel devine o căutare de temperatură în fereastra configurată. Pixelii mai reci decât min_celsius se saturează la 0, pixelii mai fierbinți decât max_celsius se saturează la 255.
csi.IOCTL_LEPTON_SET_MODE ia două indicatoare. Primul activează măsurarea; al doilea selectează intervalul de temperatură al senzorului:
Interval scăzut —
(True, False)— domeniul senzorului de la-10 °Cla+140 °C(scene la scară de cameră). Limitați fereastra la zona de interes, de ex.(20.0, 40.0)pentru urmărirea căldurii corporale:csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False) csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
Interval ridicat —
(True, True)— domeniul senzorului de la-10 °Cla~+450 °Ctipic (~+400 °Cla temperatura camerei) pentru obiecte fierbinți. Limitați la de ex.(0.0, 400.0)pentru urmărirea cuptoarelor sau a elementelor fierbinți:csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True) csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 0.0, 400.0)
Pentru a converti un pixel în tonuri de gri înapoi în grade Celsius:
def p_to_temp(p, min_t, max_t):
return (p * (max_t - min_t)) / 255.0 + min_t
Acest lucru funcționează pe pixeli individuali sau pe statistici agregate (de ex. stats.mean() din Image.get_statistics) în interiorul unui ROI atunci când localizați regiuni fierbinți/reci cu Image.find_blobs.