多光谱热成像(OV5640)

多光谱热成像摄像头模组的 OV5640 版本将一颗 5MP 卷帘快门彩色传感器与 FLIR Lepton 热成像核心相结合,使 OpenMV Cam 能够并行运行高分辨率彩色视觉和热成像处理流程。

多光谱热成像(OV5640)

完整的数据手册、照片和订购信息请参阅 多光谱热成像产品页面

备注

仅在 OpenMV Cam RT1062 上受支持。

亮点

  • OV5640:5MP 卷帘快门,提供更高分辨率的彩色图像

  • 可搭配 FLIR Lepton 1.x / 2.x / 3.x 热成像核心

  • 在单个模组上同时进行热成像与彩色处理

  • 可在完全黑暗中成像,支持温度测量

  • 彩色传感器具备自动对焦和 F2.0 光圈

用法

彩色传感器和 FLIR Lepton 各自拥有独立的 csi.CSI 实例。第一次调用默认绑定到主传感器(即 OV5640);第二次调用通过传入 cid= csi.LEPTON 绑定到 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 单元。

有两个临时缓冲区在帧循环中保持不变——一个是存储为 image.Image 的 256x1 alpha 调色板,使较冷的 Lepton 像素变为透明、较热的像素变为不透明(二次方斜坡在不压缩中间区域的前提下抑制背景细节),以及一个用 image.Image 预分配的 Lepton 帧缓冲区,使 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 Hz 运行,因此对其进行阻塞会拖慢彩色处理流程。随后 Image.draw_image 将两者合成:color_palette= image.PALETTE_IRONBOW 将 Lepton 的灰度映射为 FLIR 风格的暖色斜坡,alpha_palette= 使用二次方 alpha 映射混合每个像素,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

这适用于单个像素,也适用于 ROI 内的聚合统计数据(例如来自 Image.get_statisticsstats.mean()),可在使用 Image.find_blobs 定位热/冷区域时使用。