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)