Multispektral Termal (OV5640)¶
Multispectral Thermal Camera Module’ün OV5640 çeşidi, 5MP’lik bir rolling-shutter renk sensörünü bir FLIR Lepton termal çekirdekle eşleştirir; böylece OpenMV Cam, yüksek çözünürlüklü renkli görüş ve termal işlem hatlarını yan yana çalıştırabilir.
Tam veri sayfası, fotoğraflar ve sipariş bilgileri için Multispectral Thermal ürün sayfasına bakın.
Not
Yalnızca OpenMV Cam RT1062 üzerinde desteklenir.
Öne çıkanlar¶
OV5640: daha yüksek çözünürlüklü renk için 5MP rolling 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
Renk sensöründe otomatik odaklama ve F2.0 diyafram
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 (OV5640) 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.
OV5640, ses bobini aktüatörlü (voice-coil-actuator) bir otomatik odaklama lensine sahiptir. csi.IOCTL_TRIGGER_AUTO_FOCUS ile csi.CSI.ioctl üzerinden renk kamerasında tek bir otomatik odaklama geçişi tetikleyin — sensör odak motorunu bir kez tarar ve önündeki neyse ona kilitlenir:
csi0.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Sahne her değiştiğinde ioctl’u yeniden çağırın — otomatik odaklama tek seferliktir, sürekli değildir.
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 °Cile+140 °Carası (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 °Cile~+450 °Carası 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.