Мультиспектральна теплова камера (OV5640)

Варіант OV5640 модуля мультиспектральної теплової камери поєднує 5-мегапіксельний кольоровий датчик із ковзним затвором із тепловим ядром FLIR Lepton, що дозволяє OpenMV Cam одночасно виконувати конвеєри кольорового та теплового зображення з високою роздільною здатністю.

Multispectral Thermal (OV5640)

Для повного технічного паспорту, фотографій та замовлення перегляньте сторінку продукту 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.