Multispectral Thermal (PAG7936)¶
Varianta PAG7936 a modulului de cameră Multispectral Thermal combină un senzor color cu obturator global de 1 MP cu un nucleu termic FLIR Lepton, astfel încât camera OpenMV Cam poate rula simultan fluxuri de viziune color și fluxuri termice.
Pentru fișa tehnică completă, fotografii și comenzi, consultați pagina de produs Multispectral Thermal.
Notă
Acceptat doar pe OpenMV N6.
Aspecte principale¶
PAG7936: obturator global de 1 MP
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
Obturatorul global gestionează mișcarea rapidă fără artefacte de obturator rulant
Utilizare¶
Senzorul color și FLIR Lepton primesc fiecare propria instanță csi.CSI. Primul apel folosește în mod implicit senzorul principal (PAG7936); 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.
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.
Aliniere accelerată de GPU¶
Image.draw_image acceptă un argument transform= — o matrice de homografie 3x3 ca un tablou ulab.numpy bidimensional. Pe OpenMV N6 GPU-ul rulează proiecția per-pixel în timpul aceleiași desenări, astfel încât cadrul Lepton poate fi realiniat cu perspectiva camerei color fără o trecere de deformare separată. Calibrați matricea pentru fiecare cameră cu instrumentul thermal-overlay-calibration
import time
import csi
import image
from ulab import numpy as np
import math
# Calibration matrix from the thermal-overlay-calibration tool.
m = np.array([
[3.704807, 0.257018, 37.260564],
[0.052147, 3.609977, -7.831831],
[0.000294, 0.000552, 1.000000],
])
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.VGA)
csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False) # no hardware reset - just configure lepton
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QQVGA)
# 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,
transform=m)
print(clock.fps())
Rețineți că această variantă rulează camera color la csi.VGA (640x480) și Lepton la csi.QQVGA (160x120) — homografia proiectează cadrul Lepton mai mic în cadrul color mai mare ca parte a desenării, astfel încât factorul de mărire este integrat chiar în matrice în loc să fie aplicat separat.