FLIR Lepton 适配器

FLIR Lepton 适配器模块将 FLIR Lepton 热成像机芯(单独销售)连接到 OpenMV Cam,同时提供 AGC 和直接热成像两种模式,用于人体/物体的温度测量。

FLIR Lepton 适配器

完整的数据手册、照片和订购信息请参阅 FLIR Lepton 适配器产品页面

亮点

  • 兼容 FLIR Lepton 1.x / 2.x / 3.x 机芯(单独销售)

  • AGC 和直接热成像两种模式,均支持温度映射

  • 可在完全黑暗中成像

  • 兼容所有模块化 OpenMV Cam 基板

用法

通过 csi.CSI 并配合 cid= csi.LEPTON 来驱动 Lepton。驱动程序会在内部将 Lepton 的 80x60(1.x/2.x)或 160x120(3.x)原生帧上采样到你所设置的任意 framesize:

import csi
import time

csi0 = csi.CSI(cid=csi.LEPTON)
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
clock = time.clock()

while True:
    clock.tick()
    img = csi0.snapshot()
    print(clock.fps())

若要直接从传感器获取彩色帧,请将 pixformat 切换为 csi.RGB565,并将 csi.CSI.color_palette 设置为 image.PALETTE_IRONBOW——驱动程序会输出应用了调色板的 RGB565 帧,因此 snapshot() 会直接返回 ironbow 彩色帧:

csi0.pixformat(csi.RGB565)
csi0.color_palette(image.PALETTE_IRONBOW)

温度测量

辐射测量型 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):

    csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi0.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • 高范围——(True, True)——传感器跨度通常为 -10 °C 至约 ~+450 °C(室温下约为 ~+400 °C),用于高温物体。可限定为例如 (0.0, 400.0) 以用于熔炉或高温元件跟踪:

    csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True)
    csi0.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

这适用于单个像素,也适用于在使用 Image.find_blobs 定位高温/低温区域时对某个 ROI 内的聚合统计量(例如来自 Image.get_statisticsstats.mean())进行处理。

备注

温度测量要求 Lepton 处于灰度模式且未设置颜色调色板——线性的像素到温度映射仅在原始灰度输出上成立。若要为显示着色,请单独进行,方法是使用 Image.draw_image 并配合 color_palette= image.PALETTE_IRONBOW 将灰度帧绘制到 RGB 输出缓冲区上:

out = image.Image(csi0.width(), csi0.height(), image.RGB565)
out.draw_image(img, 0, 0, color_palette=image.PALETTE_IRONBOW)