Multispektralna termalna kamera (OV5640)

OV5640 varijanta modula multispektralne termalne kamere kombinira 5MP rolling-shutter senzor u boji s FLIR Lepton termalnom jezgrom, tako da OpenMV Cam može usporedno izvoditi cjevovode vizije u boji visoke razlučivosti i termalne cjevovode.

Multispektralna termalna kamera (OV5640)

Za potpunu tehničku dokumentaciju, fotografije i naručivanje pogledajte stranicu proizvoda Multispectral Thermal.

Napomena

Podržano samo na OpenMV Cam RT1062.

Istaknute značajke

  • OV5640: 5MP rolling shutter za boju veće razlučivosti

  • Prihvaća FLIR Lepton 1.x / 2.x / 3.x termalne jezgre

  • Istovremena obrada termalne slike i boje na jednom modulu

  • Vidi u potpunom mraku, podržava mjerenje temperature

  • Autofokus i blenda F2.0 na senzoru u boji

Upotreba

Senzor u boji i FLIR Lepton svaki dobivaju vlastitu csi.CSI instancu. Prvi poziv prema zadanim postavkama koristi primarni senzor (OV5640); drugi se veže na Lepton prosljeđivanjem cid= csi.LEPTON. Izvršite tvrdo resetiranje senzora u boji s csi.CSI.reset (hard=True) kako biste podigli napajanje, a Lepton konfigurirajte s hard=False tako da njegov upravljački program samo ponovno programira čip bez ponovnog uključivanja resetiranja.

csi.CSI.framesize ( csi.QVGA ) usklađuje izlaz Leptona s kamerom u boji, tako da svaki snapshot() vraća sličicu od 320x240. Upravljački program Leptona interno povećava svoju izvornu sličicu od 80x60 (1.x/2.x) ili 160x120 (3.x) na traženu veličinu — pri QVGA svaki Lepton piksel pokriva ćeliju 4x4 ili 2x2 na sličici u boji.

Dva privremena međuspremnika ostaju nepromijenjena tijekom petlje sličica — alfa paleta 256x1 pohranjena kao image.Image tako da hladni Lepton pikseli postaju prozirni, a vrući pikseli neprozirni (kvadratna rampa potiskuje pozadinske detalje bez gušenja srednjeg raspona), i međuspremnik slike Leptona unaprijed dodijeljen s image.Image tako da ga csi.CSI.snapshot (blocking=False, image=...) može popuniti na mjestu u svakoj iteraciji bez ponovne dodjele:

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())

Svaka iteracija uzima blokirajuću snimku u boji i neblokirajuću Lepton snimku — Lepton radi na 9 Hz pa bi blokiranje na njemu usporilo cjevovod u boji. Image.draw_image zatim kombinira njih dva: color_palette= image.PALETTE_IRONBOW preslikava sive tonove Leptona na toplu rampu boja u FLIR stilu, alpha_palette= miješa svaki piksel pomoću kvadratne alfa mape, a hint= image.BILINEAR izglađuje povećanje.

OV5640 ima autofokus leću s voice-coil aktuatorom. Pokrenite jedan prolaz autofokusa na kameri u boji putem csi.CSI.ioctl s csi.IOCTL_TRIGGER_AUTO_FOCUS — senzor jednom prelazi motorom fokusa i zaključava se na onome što se nalazi ispred njega:

csi0.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)

Ponovno izdajte ioctl svaki put kad se scena promijeni — autofokus je jednokratan, ne kontinuiran.

Mjerenje temperature

Radiometrijski Leptoni (Lepton 2.5 / 3.5) izvještavaju o kalibriranim podacima o temperaturi po pikselu. Omogućite način mjerenja putem csi.CSI.ioctl s csi.IOCTL_LEPTON_SET_MODE, zatim ograničite temperaturni prozor s csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Upravljački program Leptona linearno preslikava vrijednost sivog piksela 0 na min_celsius i 255 na max_celsius, tako da svaki piksel postaje pretraga temperature unutar konfiguriranog prozora. Pikseli hladniji od min_celsius zasićuju se na 0, pikseli topliji od max_celsius zasićuju se na 255.

csi.IOCTL_LEPTON_SET_MODE uzima dvije zastavice. Prva uključuje mjerenje; druga odabire temperaturni raspon senzora:

  • Niski raspon(True, False) — raspon senzora -10 °C do +140 °C (scene veličine prostorije). Ograničite prozor na područje interesa, npr. (20.0, 40.0) za praćenje tjelesne topline:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Visoki raspon(True, True) — raspon senzora -10 °C do tipično ~+450 °C (~+400 °C na sobnoj temperaturi) za vruće objekte. Ograničite na npr. (0.0, 400.0) za praćenje peći ili vrućih elemenata:

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

Za pretvaranje sivog piksela natrag u Celzijeve stupnjeve:

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

Ovo radi na pojedinačnim pikselima ili na agregiranim statistikama (npr. stats.mean() iz Image.get_statistics) unutar ROI pri lociranju vrućih/hladnih područja pomoću Image.find_blobs.