Мультиспектральна теплова камера (OV5640)¶
Варіант OV5640 модуля мультиспектральної теплової камери поєднує 5-мегапіксельний кольоровий датчик із ковзним затвором із тепловим ядром FLIR Lepton, що дозволяє OpenMV Cam одночасно виконувати конвеєри кольорового та теплового зображення з високою роздільною здатністю.
Для повного технічного паспорту, фотографій та замовлення перегляньте сторінку продукту Multispectral Thermal.
Примітка
Підтримується лише на OpenMV Cam RT1062.
Особливості¶
OV5640: 5MP з ковзним затвором для кольорового зображення вищої роздільної здатності
Підтримує теплові ядра FLIR Lepton 1.x / 2.x / 3.x
Одночасна теплова та кольорова обробка на одному модулі
Бачить у повній темряві, підтримує вимірювання температури
Автофокус і діафрагма F2.0 на кольоровому датчику
Використання¶
Кольоровий датчик і FLIR Lepton отримують власний екземпляр csi.CSI. Перший виклик типово звертається до основного датчика (OV5640); другий прив’язується до 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 пом’якшує масштабування.
OV5640 має об’єктив автофокусу з голосовим котушковим приводом. Запустіть однократний прохід автофокусу на кольоровій камері через csi.CSI.ioctl з csi.IOCTL_TRIGGER_AUTO_FOCUS — датчик один раз переміщує мотор фокусування та фіксується на об’єкті перед ним:
csi0.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Повторно надсилайте ioctl щоразу, коли змінюється сцена — автофокус є однократним, а не безперервним.
Вимірювання температури¶
Радіометричні 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.