Multispektral Termal (PAG7936)

Multispectral Thermal Camera Module’ün PAG7936 çeşidi, 1 MP’lik bir global-shutter renk sensörünü bir FLIR Lepton termal çekirdekle eşleştirir; böylece OpenMV Cam, renkli görüş ve termal işlem hatlarını yan yana çalıştırabilir.

Multispektral Termal (PAG7936)

Tam veri sayfası, fotoğraflar ve sipariş bilgileri için Multispectral Thermal ürün sayfasına bakın.

Not

Yalnızca OpenMV N6 üzerinde desteklenir.

Öne çıkanlar

  • PAG7936: 1 MP global shutter

  • FLIR Lepton 1.x / 2.x / 3.x termal çekirdeklerini kabul eder

  • Tek modül üzerinde eşzamanlı termal + renk işleme

  • Tam karanlıkta görür, sıcaklık ölçümünü destekler

  • Global shutter, rolling-shutter yapay etkileri olmadan hızlı hareketi işler

Kullanım

Renk sensörü ve FLIR Lepton, her biri kendi csi.CSI örneğini alır. İlk çağrı varsayılan olarak birincil sensöre (PAG7936) bağlanır; ikincisi ise cid= csi.LEPTON geçirilerek Lepton’a bağlanır. Hattı ayağa kaldırmak için renk sensörünü csi.CSI.reset (hard=True) ile donanım sıfırlamasına tabi tutun ve Lepton’u hard=False ile yapılandırın; böylece sürücüsü sıfırlamayı yeniden tetiklemeden yalnızca yongayı yeniden programlar.

csi.CSI.framesize ( csi.QVGA ) Lepton çıkışını renk kamerasıyla eşleştirir; böylece her snapshot() 320x240 bir çerçeve döndürür. Lepton sürücüsü, dahili olarak 80x60 (1.x/2.x) veya 160x120 (3.x) yerel çerçevesini istenen boyuta ölçeklendirir — QVGA’da her Lepton pikseli, renk çerçevesinde 4x4 veya 2x2’lik bir hücreyi kaplar.

İki çalışma arabelleği, çerçeve döngüsü boyunca sabit kalır — soğuk Lepton piksellerinin saydam, sıcak piksellerinin opak hale gelmesi için image.Image olarak saklanan 256x1’lik bir alfa paleti (karesel rampa, orta aralığı ezmeden arka plan ayrıntısını bastırır) ve image.Image ile önceden ayrılmış bir Lepton çerçeve arabelleği (frame buffer); böylece csi.CSI.snapshot (blocking=False, image=...) her yinelemede onu yeniden ayırma yapmadan yerinde doldurabilir:

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

Her yineleme, bloklayan bir renk anlık görüntüsü ve bloklamayan bir Lepton anlık görüntüsü alır — Lepton 9 Hz’de çalıştığından onu bloklamak renk işlem hattını yavaşlatırdı. Image.draw_image ardından ikisini birleştirir: color_palette= image.PALETTE_IRONBOW Lepton’un gri tonlamasını FLIR tarzı sıcak bir renk rampasına eşler, alpha_palette= her pikseli karesel alfa haritasını kullanarak harmanlar ve hint= image.BILINEAR ölçeklendirmeyi yumuşatır.

Sıcaklık ölçümü

Radyometrik Lepton’lar (Lepton 2.5 / 3.5), kalibre edilmiş piksel başına sıcaklık verisi raporlar. Ölçüm modunu csi.IOCTL_LEPTON_SET_MODE ile csi.CSI.ioctl üzerinden etkinleştirin, ardından sıcaklık penceresini csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius) ile sınırlayın. Lepton sürücüsü, gri tonlama piksel değeri 0’ı min_celsius ve 255’i max_celsius ile doğrusal olarak eşler; böylece her piksel, yapılandırılmış pencere içinde bir sıcaklık aramasına dönüşür. min_celsius değerinden daha soğuk pikseller 0’da, max_celsius değerinden daha sıcak pikseller 255’te doygunlaşır.

csi.IOCTL_LEPTON_SET_MODE iki bayrak alır. İlki ölçümü açar; ikincisi sensörün sıcaklık aralığını seçer:

  • Düşük aralık(True, False) — sensör aralığı -10 °C ile +140 °C arası (oda ölçekli sahneler). Pencereyi ilgi alanına sınırlayın; örn. vücut ısısı takibi için (20.0, 40.0)

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Yüksek aralık(True, True) — sıcak nesneler için tipik olarak -10 °C ile ~+450 °C arası sensör aralığı (oda sıcaklığında ~+400 °C). Fırın veya sıcak eleman takibi için örn. (0.0, 400.0) olarak sınırlayın:

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

Bir gri tonlama pikselini tekrar Santigrat’a dönüştürmek için:

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

Bu, sıcak/soğuk bölgeleri Image.find_blobs ile konumlandırırken bir ROI içindeki tek tek pikseller üzerinde veya toplulaştırılmış istatistikler (örn. Image.get_statistics ile elde edilen stats.mean()) üzerinde çalışır.

GPU hızlandırmalı hizalama

Image.draw_image, bir transform= argümanını kabul eder — 2 boyutlu bir ulab.numpy dizisi olarak 3x3 homografi matrisi. OpenMV N6 üzerinde GPU, piksel başına projeksiyonu aynı çizim sırasında çalıştırır; böylece Lepton çerçevesi, ayrı bir bükme geçişi olmadan renk kamerasının perspektifine göre yeniden hizalanabilir. Matrisi her kamera için thermal-overlay-calibration aracıyla kalibre edin:

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

Bu çeşidin renk kamerasını csi.VGA (640x480) ve Lepton’u csi.QQVGA (160x120) ile çalıştırdığını unutmayın — homografi, çizimin bir parçası olarak daha küçük Lepton çerçevesini daha büyük renk çerçevesine projekte eder; böylece ölçeklendirme çarpanı ayrı uygulanmak yerine matrisin kendisine gömülüdür.