Monispektrinen lämpökamera (PAG7936)

Monispektrisen lämpökameramoduulin PAG7936-versio yhdistää 1 MP:n global shutter -värisensorin ja FLIR Lepton -lämpöytimen, joten OpenMV Cam voi suorittaa rinnakkain värikonenäköä ja lämpökuvaputkia.

Monispektrinen lämpökamera (PAG7936)

Täydellisen tietolehden, kuvat ja tilaustiedot löydät Monispektrinen lämpökamera -tuotesivulta.

Muista

Tuettu vain OpenMV N6 -laitteella.

Kohokohdat

  • PAG7936: 1 MP global shutter

  • Hyväksyy FLIR Lepton 1.x / 2.x / 3.x -lämpöytimet

  • Samanaikainen lämpö- + värikäsittely yhdellä moduulilla

  • Näkee täydellisessä pimeydessä, tukee lämpötilan mittausta

  • Global shutter käsittelee nopean liikkeen ilman rolling shutter -vääristymiä

Käyttö

Väriaisistori ja FLIR Lepton saavat kumpikin oman csi.CSI -ilmentymänsä. Ensimmäinen kutsu käyttää oletuksena ensisijaista sensoria (PAG7936); toinen sitoutuu Leptoniin välittämällä cid= csi.LEPTON. Tee väriaisistorille kova nollaus komennolla csi.CSI.reset (hard=True) jännitelinjan käynnistämiseksi ja määritä Lepton arvolla hard=False, jotta sen ajuri vain uudelleenohjelmoi sirun nollausta uudelleen kytkemättä.

csi.CSI.framesize ( csi.QVGA ) sovittaa Leptonin ulostulon värikameraan, joten jokainen snapshot() palauttaa 320x240-kehyksen. Lepton-ajuri skaalaa sisäisesti natiivin 80x60- (1.x/2.x) tai 160x120- (3.x) kehyksensä pyydettyyn kokoon — QVGA:lla jokainen Lepton-pikseli kattaa 4x4- tai 2x2-solun värikehyksessä.

Kaksi työpuskuria pysyy muuttumattomana koko kehyssilmukan ajan — 256x1-alfapaletti tallennettuna image.Image -muotoon, jotta viileät Lepton-pikselit muuttuvat läpinäkyviksi ja kuumat pikselit läpinäkymättömiksi (neliöllinen ramppi vaimentaa taustan yksityiskohdat tukahduttamatta keskialuetta), sekä Lepton-kehyspuskuri, joka on esivarattu image.Image -muotoon, jotta csi.CSI.snapshot (blocking=False, image=...) voi täyttää sen paikallaan joka kierroksella ilman uudelleenvarausta:

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

Jokainen kierros ottaa estävän väritilannekuvan ja estämättömän Lepton-tilannekuvan — Lepton toimii 9 Hz:n taajuudella, joten sen estäminen kuristaisi värikuvaputken. Image.draw_image yhdistää sitten nämä kaksi: color_palette= image.PALETTE_IRONBOW kuvaa Leptonin harmaasävyt FLIR-tyyliseksi lämpimäksi värirampiksi, alpha_palette= sekoittaa jokaisen pikselin neliöllisen alfakartan avulla ja hint= image.BILINEAR tasoittaa skaalauksen.

Lämpötilan mittaus

Radiometriset Leptonit (Lepton 2.5 / 3.5) raportoivat kalibroidut pikselikohtaiset lämpötilatiedot. Ota mittaustila käyttöön komennolla csi.CSI.ioctl ja csi.IOCTL_LEPTON_SET_MODE -lipulla ja rajaa sitten lämpötilaikkuna komennolla csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Lepton-ajuri kuvaa lineaarisesti harmaasävypikselin arvon 0 arvoon min_celsius ja arvon 255 arvoon max_celsius, joten jokaisesta pikselistä tulee lämpötilahaku määritetyn ikkunan sisällä. Arvoa min_celsius kylmemmät pikselit saturoituvat arvoon 0 ja arvoa max_celsius kuumemmat pikselit arvoon 255.

csi.IOCTL_LEPTON_SET_MODE ottaa kaksi lippua. Ensimmäinen kytkee mittauksen päälle; toinen valitsee sensorin lämpötila-alueen:

  • Matala alue(True, False) — sensorin alue -10 °C+140 °C (huoneen kokoiset näkymät). Rajaa ikkuna kohdealueeseen, esim. (20.0, 40.0) kehonlämmön seurantaan:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Korkea alue(True, True) — sensorin alue tyypillisesti -10 °C~+450 °C (~+400 °C huoneenlämmössä) kuumia kohteita varten. Rajaa esim. arvoon (0.0, 400.0) uunin tai kuuman elementin seurantaan:

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

Muuntaaksesi harmaasävypikselin takaisin celsiusasteiksi:

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

Tämä toimii yksittäisiin pikseleihin tai koottuihin tilastoihin (esim. stats.mean() funktiosta Image.get_statistics) ROI:n sisällä, kun paikannetaan kuumia/viileitä alueita funktiolla Image.find_blobs.

GPU-kiihdytetty kohdistus

Image.draw_image hyväksyy transform= -argumentin — 3x3-homografiamatriisin 2-ulotteisena ulab.numpy-taulukkona. OpenMV N6 -laitteella GPU suorittaa pikselikohtaisen projektion saman piirron aikana, joten Lepton-kehys voidaan kohdistaa uudelleen värikameran perspektiiviin nähden ilman erillistä vääntövaihetta. Kalibroi matriisi kullekin kameralle thermal-overlay-calibration-työkalulla

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

Huomaa, että tämä versio käyttää värikameraa resoluutiolla csi.VGA (640x480) ja Leptonia resoluutiolla csi.QQVGA (160x120) — homografia projisoi pienemmän Lepton-kehyksen suurempaan värikehykseen osana piirtoa, joten skaalauskerroin on leivottu itse matriisiin sen sijaan, että se sovellettaisiin erikseen.