Multispektrális termikus (PAG7936)

A Multispectral Thermal Camera Module PAG7936 változata egy 1 MP-es globális zárú színes érzékelőt párosít egy FLIR Lepton termikus maggal, így az OpenMV Cam egymás mellett futtathat színes és termikus pipeline-okat.

Multispektrális termikus (PAG7936)

A teljes adatlapért, fényképekért és rendeléshez lásd a Multispectral Thermal termékoldalt.

Megjegyzés

Csak az OpenMV N6 modellen támogatott.

Kiemelt jellemzők

  • PAG7936: 1 MP-es globális zár

  • FLIR Lepton 1.x / 2.x / 3.x termikus magokat fogad

  • Egyidejű termikus + színes feldolgozás egyetlen modulon

  • Teljes sötétségben is lát, támogatja a hőmérséklet-mérést

  • A globális zár gördülő zárú műtermékek nélkül kezeli a gyors mozgást

Használat

A színes érzékelő és a FLIR Lepton egyaránt saját csi.CSI példányt kap. Az első hívás alapértelmezetten az elsődleges érzékelőre (a PAG7936-ra) áll be; a második a cid= csi.LEPTON átadásával a Leptonhoz kötődik. A színes érzékelőt a csi.CSI.reset (hard=True) hívással indítsd újra teljes reszettel, hogy felálljon a tápsín, a Leptont pedig hard=False értékkel konfiguráld, hogy a meghajtója csak újraprogramozza a chipet anélkül, hogy újra váltogatná a resetet.

A csi.CSI.framesize ( csi.QVGA ) a Lepton kimenetét a színes kamerához igazítja, így minden snapshot() egy 320x240-es képkockát ad vissza. A Lepton meghajtó belsőleg felskálázza a 80x60-as (1.x/2.x) vagy 160x120-as (3.x) natív képkockáját a kért méretre — QVGA esetén minden Lepton-képpont egy 4x4-es vagy 2x2-es cellát fed le a színes képkockán.

Két ideiglenes puffer állandó marad a képkocka-cikluson át — egy 256x1-es alfa-paletta image.Image formában tárolva, hogy a hideg Lepton-képpontok átlátszóvá, a forrók pedig átlátszatlanná váljanak (a kvadratikus rámpa elnyomja a háttér részleteit anélkül, hogy a középtartományt összenyomná), valamint egy image.Image segítségével előre lefoglalt Lepton képkocka-puffer, hogy a csi.CSI.snapshot (blocking=False, image=...) minden iterációban helyben kitölthesse újrafoglalás nélkül:

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

Minden iteráció egy blokkoló színes pillanatképet és egy nem blokkoló Lepton-pillanatképet készít — a Lepton 9 Hz-en fut, így a rá való blokkolás visszafogná a színes pipeline-t. Az Image.draw_image ezután összefűzi a kettőt: a color_palette= image.PALETTE_IRONBOW a Lepton szürkeárnyalatát FLIR-stílusú meleg színrámpára képezi le, az alpha_palette= minden képpontot a kvadratikus alfa-térkép szerint kever, a hint= image.BILINEAR pedig elsimítja a felskálázást.

Hőmérséklet-mérés

A radiometrikus Leptonok (Lepton 2.5 / 3.5) kalibrált, képpontonkénti hőmérséklet-adatokat szolgáltatnak. Engedélyezd a mérési módot a csi.CSI.ioctl hívással és a csi.IOCTL_LEPTON_SET_MODE paraméterrel, majd szűkítsd le a hőmérséklet-ablakot a csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius) hívással. A Lepton meghajtó lineárisan képezi le a 0-ás szürkeárnyalatos képpontértéket a min_celsius-ra és a 255-öst a max_celsius-ra, így minden képpont egy hőmérséklet-keresés lesz a beállított ablakon belül. A min_celsius-nál hidegebb képpontok 0-ra, a max_celsius-nál forróbbak 255-re telítődnek.

A csi.IOCTL_LEPTON_SET_MODE két jelzőt vesz át. Az első bekapcsolja a mérést; a második kiválasztja az érzékelő hőmérséklet-tartományát:

  • Alacsony tartomány(True, False) — érzékelő-tartomány -10 °C-tól +140 °C-ig (szobaléptékű jelenetek). Szűkítsd az ablakot az érdeklődési területre, pl. (20.0, 40.0) testhő-követéshez:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Magas tartomány(True, True) — érzékelő-tartomány tipikusan -10 °C-tól ~+450 °C-ig (~+400 °C szobahőmérsékleten) forró tárgyakhoz. Szűkítsd pl. (0.0, 400.0) értékre kemence- vagy forró elem követéséhez:

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

Egy szürkeárnyalatos képpont visszaalakítása Celsiusra:

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

Ez működik egyedi képpontokon vagy aggregált statisztikákon is (pl. stats.mean() az Image.get_statistics hívásból) egy ROI-n belül, amikor forró/hideg régiókat keresel az Image.find_blobs segítségével.

GPU-gyorsított igazítás

Az Image.draw_image elfogad egy transform= argumentumot — egy 3x3-as homográfia mátrixot 2-D ulab.numpy tömbként. Az OpenMV N6-on a GPU ugyanazon rajzolás során végzi el a képpontonkénti projekciót, így a Lepton képkockája külön torzítási menet nélkül igazítható újra a színes kamera perspektívájához. Kamránként kalibráld a mátrixot a thermal-overlay-calibration eszközzel

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

Vedd figyelembe, hogy ez a változat a színes kamerát csi.VGA (640x480) felbontáson, a Leptont pedig csi.QQVGA (160x120) felbontáson futtatja — a homográfia a rajzolás részeként vetíti a kisebb Lepton-képkockát a nagyobb színes képkockába, így a felskálázási tényező magába a mátrixba van beépítve, nem külön alkalmazva.