Đa Phổ Nhiệt (PAG7936)

Biến thể PAG7936 của Module Camera Đa Phổ Nhiệt kết hợp cảm biến màu global-shutter 1 MP với lõi nhiệt FLIR Lepton, cho phép OpenMV Cam chạy song song các pipeline thị giác màu và nhiệt.

Multispectral Thermal (PAG7936)

Để xem datasheet đầy đủ, ảnh và đặt hàng, hãy truy cập trang sản phẩm Multispectral Thermal.

Ghi chú

Chỉ hỗ trợ trên OpenMV N6.

Điểm nổi bật

  • PAG7936: global shutter 1 MP

  • Hỗ trợ lõi nhiệt FLIR Lepton 1.x / 2.x / 3.x

  • Xử lý nhiệt + màu đồng thời trên một module

  • Nhìn được trong bóng tối hoàn toàn, hỗ trợ đo nhiệt độ

  • Global shutter xử lý được chuyển động nhanh mà không có hiện tượng rolling-shutter

Cách sử dụng

Cảm biến màu và FLIR Lepton mỗi cái có instance csi.CSI riêng. Lần gọi đầu tiên mặc định là cảm biến chính (PAG7936); lần gọi thứ hai gắn với Lepton bằng cách truyền cid= csi.LEPTON. Hard-reset cảm biến màu bằng csi.CSI.reset (hard=True) để khởi động rail, và cấu hình Lepton với hard=False để driver chỉ lập trình lại chip mà không bật/tắt lại reset.

csi.CSI.framesize ( csi.QVGA ) khớp đầu ra Lepton với camera màu, do đó mỗi snapshot() trả về một khung hình 320x240. Driver Lepton nội bộ upscale khung gốc 80x60 (1.x/2.x) hoặc 160x120 (3.x) lên kích thước yêu cầu — ở QVGA mỗi điểm ảnh Lepton phủ một ô 4x4 hoặc 2x2 trên khung màu.

Hai bộ đệm scratch không đổi trong vòng lặp khung hình — một bảng màu alpha 256x1 được lưu dưới dạng image.Image để các điểm ảnh Lepton lạnh trở nên trong suốt và điểm ảnh nóng trở nên đục (dốc bậc hai loại bỏ chi tiết nền mà không làm mất dải giữa), và một bộ đệm khung hình Lepton được cấp phát trước bằng image.Image để csi.CSI.snapshot (blocking=False, image=...) có thể điền vào đó mỗi vòng lặp mà không cần cấp phát lại:

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())

Mỗi vòng lặp chụp một ảnh màu blocking và một ảnh Lepton non-blocking — Lepton chạy ở 9 Hz nên blocking sẽ làm chậm pipeline màu. Image.draw_image sau đó ghép hai ảnh: color_palette= image.PALETTE_IRONBOW ánh xạ thang xám của Lepton thành dải màu nóng kiểu FLIR, alpha_palette= pha trộn từng điểm ảnh theo bảng alpha bậc hai, và hint= image.BILINEAR làm mượt khi upscale.

Đo nhiệt độ

Lepton đo nhiệt xạ (Lepton 2.5 / 3.5) báo cáo dữ liệu nhiệt độ hiệu chỉnh theo từng điểm ảnh. Bật chế độ đo thông qua csi.CSI.ioctl với csi.IOCTL_LEPTON_SET_MODE, sau đó giới hạn cửa sổ nhiệt độ bằng csi.IOCTL_LEPTON_SET_RANGE (min_celsius, max_celsius). Driver Lepton ánh xạ tuyến tính giá trị điểm ảnh thang xám 0 thành min_celsius và 255 thành max_celsius, do đó mỗi điểm ảnh trở thành một tra cứu nhiệt độ trong cửa sổ đã cấu hình. Điểm ảnh lạnh hơn min_celsius bão hòa ở 0, điểm ảnh nóng hơn max_celsius bão hòa ở 255.

csi.IOCTL_LEPTON_SET_MODE nhận hai cờ. Cờ đầu tiên bật đo; cờ thứ hai chọn phạm vi nhiệt độ của cảm biến:

  • Phạm vi thấp(True, False) — khoảng cảm biến từ -10 °C đến +140 °C (cảnh nhiệt độ phòng). Giới hạn cửa sổ về vùng quan tâm, ví dụ (20.0, 40.0) để theo dõi nhiệt cơ thể:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, False)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 20.0, 40.0)
    
  • Phạm vi cao(True, True) — khoảng cảm biến từ -10 °C đến ~+450 °C thông thường (~+400 °C ở nhiệt độ phòng) cho các vật nóng. Giới hạn ở ví dụ (0.0, 400.0) để theo dõi lò hoặc phần tử nhiệt:

    csi1.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True)
    csi1.ioctl(csi.IOCTL_LEPTON_SET_RANGE, 0.0, 400.0)
    

Để chuyển đổi một điểm ảnh thang xám về Celsius:

def p_to_temp(p, min_t, max_t):
    return (p * (max_t - min_t)) / 255.0 + min_t

Điều này hoạt động trên các điểm ảnh riêng lẻ hoặc trên thống kê tổng hợp (ví dụ stats.mean() từ Image.get_statistics) bên trong một ROI khi tìm vùng nóng/lạnh bằng Image.find_blobs.

Căn chỉnh tăng tốc GPU

Image.draw_image chấp nhận đối số transform= — một ma trận homography 3x3 dưới dạng mảng ulab.numpy 2-D. Trên OpenMV N6, GPU thực hiện phép chiếu theo từng điểm ảnh trong cùng lần vẽ, để khung hình Lepton có thể được căn chỉnh lại theo góc nhìn của camera màu mà không cần một lần warp riêng. Hiệu chỉnh ma trận theo từng camera bằng công cụ thermal-overlay-calibration

import time
import csi
import image
from ulab import numpy as np
import math

# Calibration matrix from the thermal-overlay-calibration tool.
m = np.array([
    [3.704807, 0.257018, 37.260564],
    [0.052147, 3.609977, -7.831831],
    [0.000294, 0.000552, 1.000000],
])

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.VGA)

csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False)  # no hardware reset - just configure lepton
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QQVGA)

# 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,
                    transform=m)
    print(clock.fps())

Lưu ý rằng biến thể này chạy camera màu ở csi.VGA (640x480) và Lepton ở csi.QQVGA (160x120) — homography chiếu khung hình Lepton nhỏ hơn vào khung hình màu lớn hơn như một phần của lần vẽ, do đó hệ số upscale được tích hợp vào ma trận thay vì áp dụng riêng.