多光譜熱成像(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) 對彩色感測器進行硬重置以拉起電源軌,並以 hard=False 設定 Lepton,使其驅動程式只重新編程晶片而不再次切換重置訊號。

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

這適用於個別像素,或在以 Image.find_blobs 定位高溫/低溫區域時,對 ROI 內的彙總統計值(例如來自 Image.get_statisticsstats.mean())進行運算。