Мультиспектральна теплова камера (PAG7936)¶
Варіант PAG7936 модуля мультиспектральної теплової камери поєднує 1-мегапіксельний кольоровий датчик із глобальним затвором із тепловим ядром FLIR Lepton, що дозволяє OpenMV Cam одночасно виконувати конвеєри кольорового та теплового зображення.
Для повного технічного паспорту, фотографій та замовлення перегляньте сторінку продукту Multispectral Thermal.
Примітка
Підтримується лише на OpenMV N6.
Особливості¶
PAG7936: 1 MP з глобальним затвором
Підтримує теплові ядра FLIR Lepton 1.x / 2.x / 3.x
Одночасна теплова та кольорова обробка на одному модулі
Бачить у повній темряві, підтримує вимірювання температури
Глобальний затвор усуває артефакти ковзного затвору при швидкому русі
Використання¶
Кольоровий датчик і FLIR Lepton отримують власний екземпляр csi.CSI. Перший виклик типово звертається до основного датчика (PAG7936); другий прив’язується до Lepton шляхом передачі cid= csi.LEPTON. Виконайте жорстке скидання кольорового датчика через csi.CSI.reset (hard=True), щоб увімкнути живлення, а Lepton налаштуйте з hard=False — його драйвер лише перепрограмує мікросхему без повторного перемикання скидання.
csi.CSI.framesize ( csi.QVGA ) узгоджує виведення Lepton із кольоровою камерою, тому кожен snapshot() повертає кадр 320x240. Драйвер Lepton внутрішньо масштабує нативний кадр 80x60 (1.x/2.x) або 160x120 (3.x) до запитаного розміру — при QVGA кожен піксель Lepton займає комірку 4x4 або 2x2 на кольоровому кадрі.
Два робочі буфери залишаються незмінними протягом циклу кадрів: 256x1 альфа-палітра, збережена як image.Image, завдяки чому холодні пікселі Lepton стають прозорими, а гарячі — непрозорими (квадратична крива пригнічує фонові деталі, не зменшуючи середній діапазон), та кадровий буфер Lepton, попередньо виділений із image.Image, щоб csi.CSI.snapshot (blocking=False, image=...) міг заповнювати його на місці кожну ітерацію без повторного виділення пам’яті:
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())
Кожна ітерація робить блокуючий кольоровий знімок і неблокуючий знімок Lepton — Lepton працює зі швидкістю 9 Гц, тому блокування на ньому гальмувало б кольоровий конвеєр. Потім Image.draw_image компонує обидва зображення: color_palette= image.PALETTE_IRONBOW відображає відтінки сірого Lepton на теплову кольорову шкалу у стилі FLIR, alpha_palette= змішує кожен піксель за допомогою квадратичної альфа-карти, а hint= image.BILINEAR пом’якшує масштабування.
Вимірювання температури¶
Радіометричні Lepton (Lepton 2.5 / 3.5) надають відкалібровані дані температури для кожного пікселя. Увімкніть режим вимірювання через csi.CSI.ioctl з csi.IOCTL_LEPTON_SET_MODE, потім обмежте вікно температури за допомогою csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Драйвер Lepton лінійно відображає значення пікселя у відтінках сірого 0 на min_celsius і 255 на max_celsius, тому кожен піксель стає пошуком температури у межах налаштованого вікна. Пікселі холодніші за min_celsius насичуються до 0, пікселі гарячіші за max_celsius насичуються до 255.
csi.IOCTL_LEPTON_SET_MODE приймає два прапори. Перший вмикає вимірювання; другий вибирає діапазон температур датчика:
Низький діапазон —
(True, False)— діапазон датчика від-10 °Cдо+140 °C(сцени кімнатного масштабу). Обмежте вікно на область інтересу, наприклад(20.0, 40.0)для відстеження теплового випромінювання тіла:csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False) csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
Високий діапазон —
(True, True)— типовий діапазон датчика від-10 °Cдо~+450 °C(~+400 °Cпри кімнатній температурі) для гарячих об’єктів. Обмежте до наприклад(0.0, 400.0)для відстеження печі або гарячих елементів:csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True) csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 0.0, 400.0)
Для перетворення пікселя у відтінках сірого назад у Цельсій:
def p_to_temp(p, min_t, max_t):
return (p * (max_t - min_t)) / 255.0 + min_t
Це працює для окремих пікселів або для агрегованої статистики (наприклад, stats.mean() з Image.get_statistics) всередині ROI при локалізації гарячих/холодних регіонів за допомогою Image.find_blobs.
Апаратно-прискорене вирівнювання¶
Image.draw_image приймає аргумент transform= — матрицю гомографії 3x3 як двовимірний масив ulab.numpy. На OpenMV N6 GPU виконує проекцію кожного пікселя під час того самого малювання, тому кадр Lepton може бути повторно вирівняний відносно перспективи кольорової камери без окремого проходу деформації. Відкалібруйте матрицю для кожної камери за допомогою інструменту thermal-overlay-calibration
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())
Зверніть увагу, що цей варіант запускає кольорову камеру при csi.VGA (640x480), а Lepton при csi.QQVGA (160x120) — гомографія проектує менший кадр Lepton у більший кольоровий кадр під час малювання, тому коефіцієнт масштабування вбудований безпосередньо у матрицю, а не застосовується окремо.