Camera Sự Kiện Đa Phổ

Module Camera Sự Kiện Đa Phổ kết hợp cảm biến sự kiện GENX320 với cảm biến màu sắc PAG7936 1 MP kiểu cửa trập toàn cục trên một module duy nhất — một pipeline sự kiện + màu sắc đồng bộ cho theo dõi vật thể tốc độ cao, theo dõi LED, dòng chảy chất lỏng và các cảnh động khác.

Camera Sự Kiện Đa Phổ

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

Ghi chú

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

Điểm nổi bật

  • Cảm biến sự kiện 320x320, dải động >140 dB, histogram 375 Hz+

  • PAG7936 màu sắc: 1280x800 @ 120 FPS, 640x400 @ 240 FPS

  • Timestamp sự kiện đồng bộ với trigger phơi sáng chung

  • Hoạt động dưới 5 lux mà không cần tự động phơi sáng

  • Công suất bắt đầu từ ~3 mW khi phát sự kiện

  • Nhắm đến theo dõi tốc độ cao, theo dõi LED và dòng chảy chất lỏng/hạt

Cách sử dụng

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

GENX320 xuất 320x320 ở chế độ histogram; PAG7936 ở csi.QVGA xuất 320x200. Lớp phủ cơ bản bên dưới cắt bỏ 120 hàng cuối của khung hình GENX320. Sử dụng phép biến đổi homography (bên dưới) để có lớp phủ vừa khít hoặc framesize PAG7936 lớn hơn.

Hai bộ đệm tạm thời giữ nguyên qua toàn bộ vòng lặp khung hình — một bảng alpha 256x1 được lưu dưới dạng image.Image để các điểm ảnh histogram ở mức xám cơ sở (128) trở nên trong suốt và cả điểm sáng sự kiện ON lẫn bóng sự kiện OFF trở nên đục, và một bộ đệm khung hình GENX320 đượ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 lần lặp mà không cần tái cấp phát:

import time
import csi
import image
import math

# V-shaped alpha: pixels far from the baseline 128 become opaque.
alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
    alpha_pal[i] = int(math.pow(abs(i - 128) / 128.0, 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.GENX320)
csi1.reset(hard=False)  # no hardware reset - just configure GENX320
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize((320, 320))
csi1.brightness(128)  # histogram baseline (default)
csi1.contrast(64)     # per-event step

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_EVT_LIGHT,
                    alpha_palette=alpha_pal,
                    hint=image.BILINEAR)
    print(clock.fps())

Mỗi lần lặp thực hiện một ảnh chụp màu sắc blocking và một ảnh chụp GENX320 non-blocking. Image.draw_image sau đó ghép hai ảnh: color_palette= image.PALETTE_EVT_LIGHT (hoặc image.PALETTE_EVT_DARK cho nền tối) ánh xạ histogram thang xám của GENX320 thành một dải màu sắc, alpha_palette= pha trộn từng điểm ảnh bằng bản đồ alpha hình chữ V để vùng tĩnh của cảnh nhìn xuyên qua ảnh màu, và hint= image.BILINEAR làm mịn khi phóng to khi cảm biến màu chạy ở độ phân giải cao hơn GENX320.

Các ioctls presets bias, bộ lọc AFK, hiệu chỉnh điểm nóng và bộ lọc STC của GENX320 đều hoạt động theo cùng cách trong thiết lập camera kép này — gọi chúng trên csi1 sau csi.CSI.reset. Xem các phần bên dưới để biết chi tiết.

Căn chỉnh tăng tốc bằng 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 chạy phép chiếu trên từng điểm ảnh trong cùng lần vẽ, vì vậy khung hình GENX320 có thể được căn chỉnh lại theo góc nhìn của camera màu sắc mà không cần bước warp riêng biệt — hữu ích khi hai cảm biến có quang học hoặc trường nhìn hơi khác nhau, hoặc khi camera màu chạy ở độ phân giải cao hơn. Hiệu chỉnh ma trận cho từng camera bằng công cụ GenX320 Overlay Calibration, hiển thị bàn cờ nhấp nháy để cảm biến sự kiện tạo ra các sự kiện góc mà không cần chuyển động vật lý:

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

# Calibration matrix from the GenX320 Overlay Calibration tool.
m = np.array([
    [2.000000, 0.000000,   0.000000],
    [0.000000, 2.000000,  80.000000],
    [0.000000, 0.000000,   1.000000],
])

alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
    alpha_pal[i] = int(math.pow(abs(i - 128) / 128.0, 2) * 255)

# Setup the color camera sensor.
csi0 = csi.CSI()
csi0.reset(hard=True)
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)

csi1 = csi.CSI(cid=csi.GENX320)
csi1.reset(hard=False)
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize((320, 320))
csi1.brightness(128)
csi1.contrast(64)

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_EVT_LIGHT,
                    alpha_palette=alpha_pal,
                    hint=image.BILINEAR,
                    transform=m)
    print(clock.fps())

Biến thể này chạy camera màu ở csi.VGA (640x480) và GENX320 ở độ phân giải gốc 320x320 — homography chiếu khung hình GENX320 nhỏ hơn vào khung hình màu lớn hơn như một phần của quá trình vẽ, vì vậy hệ số phóng to được tích hợp vào chính ma trận thay vì áp dụng riêng biệt.

Chi tiết camera sự kiện

GENX320 là cảm biến thị giác dựa trên sự kiện — thay vì đọc toàn bộ mảng 320x320 theo xung nhịp khung hình cố định, mỗi điểm ảnh báo cáo các "sự kiện" không đồng bộ ngay khi nó phát hiện thay đổi độ sáng. Mỗi sự kiện mang tọa độ X/Y, cực tính ON/OFF (sáng→tối hoặc tối→sáng), và timestamp microsecond. Đó là nguồn gốc của độ chính xác thời gian microsecond, không bị nhòe chuyển động, dải động rất cao và mức tiêu thụ điện theo hoạt động của cảm biến. Cảnh tĩnh không tạo ra dữ liệu.

Firmware OpenMV hiển thị GENX320 qua csi.CSI với cid= csi.GENX320. Có hai chế độ hoạt động:

  • Chế độ Histogram (mặc định) — các sự kiện được tích lũy on-chip vào các bin theo từng điểm ảnh và báo cáo dưới dạng khung hình thang xám 320x320 ở tốc độ có thể cấu hình (~20-350 FPS). Cảm biến hoạt động như một camera thông thường, vì vậy tất cả các quy trình xử lý ảnh tiêu chuẩn (Image.find_blobs, bảng màu, v.v.) đều hoạt động trực tiếp.

  • Chế độ Sự kiện — các sự kiện thô truyền vào ndarray numpy với đầy đủ timestamp microsecond, dành cho các ứng dụng cần chi tiết thời gian hơn là một khung hình đã bin trước.

Chế độ Histogram

Trong chế độ histogram, GENX320 xuất các khung hình thang xám trong đó mỗi điểm ảnh mã hóa hoạt động sự kiện gần đây tại vị trí đó. Các điểm ảnh trên mức sáng cơ sở là sự kiện ON (độ sáng tăng), bên dưới là sự kiện OFF (độ sáng giảm). Mức sáng cơ sở mặc định là 128 và bước tương phản mỗi sự kiện là 16 — tăng tương phản lên để làm nổi bật sự kiện:

import csi
import time

csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize((320, 320))
csi0.brightness(128)  # baseline (default 128)
csi0.contrast(16)     # per-event step
csi0.framerate(50)    # 20-350 FPS

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

csi.CSI.brightness, csi.CSI.contrastcsi.CSI.framerate là ba thông số định hình đầu ra histogram.

Đầu ra có màu sắc

Đặt csi.CSI.color_palette thành image.PALETTE_EVT_LIGHT cho nền sáng hoặc image.PALETTE_EVT_DARK cho nền tối — driver xuất các khung hình RGB565 sử dụng bảng màu trực tiếp:

csi0.color_palette(image.PALETTE_EVT_LIGHT)

Hiệu chỉnh điểm nóng

Cảm biến sự kiện tích lũy "điểm nóng" bắn ngẫu nhiên. Chạy csi.IOCTL_GENX320_CALIBRATE trên một cảnh tĩnh để vô hiệu hóa chúng. Driver xây dựng số lần nhấn theo từng điểm ảnh 320x320, tính giá trị trung bình và độ lệch chuẩn, và vô hiệu hóa bất kỳ điểm ảnh nào có số lần đếm vượt mean + sigma * stddev — sau đó các điểm ảnh bị vô hiệu hóa ngừng phát sự kiện ở cấp độ cảm biến.

Hai tham số kiểm soát việc hiệu chỉnh:

  • event_count — số sự kiện cần tính trước khi tính thống kê. Vòng lặp thu thập các khung hình cho đến khi tổng sự kiện tích lũy vượt ngân sách này. Số lượng cao hơn cho ước tính đáng tin cậy hơn với chi phí thời gian hiệu chỉnh dài hơn. 10000 là điểm khởi đầu hợp lý.

  • sigma — hệ số nhân ngưỡng trên độ lệch chuẩn. Giá trị thấp hơn thì mạnh hơn (nhiều điểm ảnh bị vô hiệu hóa hơn); giá trị cao hơn thì bảo thủ hơn. 0.5 là mặc định tốt.

Hướng cảm biến vào một cảnh tĩnh trước để mọi sự kiện do chuyển động gây ra không bị tính cho các điểm ảnh thực sự ổn:

csi0.snapshot(time=5000)  # let the user steady the camera
disabled = csi0.ioctl(csi.IOCTL_GENX320_CALIBRATE, 10000, 0.5)
print(f"disabled {disabled} hot pixels")

Bộ lọc chống nhấp nháy (AFK)

Các nguồn sáng theo chu kỳ (đèn huỳnh quang, màn hình LED) tạo ra lượng lớn sự kiện dư thừa. Bộ lọc AFK loại bỏ các sự kiện mà điểm ảnh chuyển đổi ở tần số trong một dải — bật nó qua csi.IOCTL_GENX320_SET_AFK với các cạnh dải tính bằng hertz:

csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 1, 130, 160)  # 130-160 Hz
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 0)            # disable

Presets Bias

Mỗi điểm ảnh trong GenX320 chạy một bộ xử lý tín hiệu tương tự với một số bias có thể cấu hình. Chúng điều chỉnh cùng nhau về độ nhạy, nhiễu, băng thông điểm ảnh và tốc độ sự kiện — sự kết hợp đúng phụ thuộc vào cảnh. Các bias riêng lẻ là:

  • DIFF_ON — ngưỡng tương phản bộ so sánh dương. Một điểm ảnh phát ra sự kiện ON khi log-illumination của nó đã tăng nhiều đến mức này. Thấp hơn = nhạy hơn với các chuyển tiếp sáng.

  • DIFF_OFF — ngưỡng tương phản bộ so sánh âm (đối xứng với DIFF_ON cho các sự kiện OFF). Thấp hơn = nhạy hơn với các chuyển tiếp tối.

  • FO — tần số cắt thông thấp của điểm ảnh. Cao hơn = băng thông điểm ảnh rộng hơn (phản hồi nhanh hơn, độ trễ thấp hơn) nhưng hoạt động nhiễu nền nhiều hơn.

  • HPF — tần số cắt thông cao. Cao hơn = loại bỏ mạnh hơn các thay đổi độ sáng chậm; chỉ các chuyển tiếp nhanh mới đến được bộ so sánh. Hữu ích để bỏ qua sự trôi dạt môi trường xung quanh.

  • REFR — thời gian trơ. Sau khi một điểm ảnh bắn, nó ở trạng thái reset trong thời gian này trước khi có thể bắn lại. Cao hơn = thời gian chết dài hơn, hữu ích để giới hạn tốc độ sự kiện mỗi điểm ảnh.

Sau csi.CSI.reset, driver áp dụng csi.GENX320_BIASES_LOW_NOISE, không phải csi.GENX320_BIASES_DEFAULT — các mặc định của datasheet phát ra tốc độ sự kiện nền cao hơn nhiều, vì vậy LOW_NOISE được sử dụng làm điểm khởi đầu để giữ luồng im lặng. Gọi csi.IOCTL_GENX320_SET_BIASES với preset khác khi ứng dụng cần độ nhạy hoặc băng thông cao hơn.

csi.IOCTL_GENX320_SET_BIASES áp dụng một trong năm presets:

  • csi.GENX320_BIASES_DEFAULT — mặc định datasheet GenX320. Độ nhạy, nhiễu và băng thông cân bằng cho các cảnh tổng quát.

  • csi.GENX320_BIASES_LOW_LIGHT — cả hai ngưỡng tương phản được nới lỏng để tăng độ nhạy, FO thấp hơn để giữ nhiễu thấp, và HPF đặt về 0 để các thay đổi độ sáng chậm vẫn được ghi nhận — cảnh ánh sáng yếu tạo ra ít sự kiện, vì vậy chúng ta muốn nhiều sự kiện nhất có thể đi qua.

  • csi.GENX320_BIASES_ACTIVE_MARKER — được tinh chỉnh để theo dõi LED nhấp nháy tương phản cao. Ngưỡng tương phản được tăng cao để chỉ các chuyển tiếp sắc nét mới kích hoạt; FO và HPF được đẩy cao để tối đa hóa băng thông điểm ảnh và loại bỏ mọi trôi dạt chậm xung quanh; REFR kéo về 0 để mọi cạnh nhấp nháy được nắm bắt liên tiếp. Kết quả: một luồng gần như toàn bộ là cạnh LED, dễ theo dõi.

  • csi.GENX320_BIASES_LOW_NOISE — mặc định driver. Cả hai ngưỡng tương phản tăng so với DEFAULT (ít nhạy hơn) và FO thấp hơn (điểm ảnh chậm hơn = điểm ảnh yên tĩnh hơn). Tốt nhất cho các cảnh tĩnh hoặc chậm khi các sự kiện sai nếu không sẽ chiếm ưu thế.

  • csi.GENX320_BIASES_HIGH_SPEED — FO được tăng để mỗi điểm ảnh có thể phản hồi nhanh hơn, HPF tăng để loại bỏ trôi dạt độ sáng chậm, và REFR tăng để một cạnh chuyển động nhanh duy nhất không làm tràn ngập đầu đọc — thời gian chết dài hơn giữ khối lượng sự kiện ổn định dưới chuyển động mạnh.

Ghi đè các bias riêng lẻ bằng csi.IOCTL_GENX320_SET_BIAS cộng với một trong csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF hoặc csi.GENX320_BIAS_REFR và một giá trị DAC. Mỗi bias được đặt độc lập — chọn một preset làm điểm khởi đầu, sau đó điều chỉnh các bias mà cảnh của bạn cần:

csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_LOW_LIGHT)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIAS, csi.GENX320_BIAS_HPF, 20)

Theo dõi

Vì đầu ra chế độ histogram chỉ là một ảnh thang xám, theo dõi vùng màu (blob) thông thường hoạt động trực tiếp. Để theo dõi LED active-marker, tải preset bias active-marker và tìm các vùng màu ở đầu sáng của histogram:

import csi
import time

csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize((320, 320))
csi0.brightness(128)
csi0.contrast(16)
csi0.framerate(200)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_ACTIVE_MARKER)

clock = time.clock()
while True:
    clock.tick()
    img = csi0.snapshot()
    for blob in img.find_blobs([(120, 140)], invert=True,
                               pixels_threshold=2, area_threshold=4,
                               merge=True):
        img.draw_detection(blob)
    print(clock.fps())

Chế độ Sự kiện

Chế độ sự kiện bỏ qua histogram on-chip và truyền các sự kiện thô vào ndarray numpy. Mỗi sự kiện là một hàng gồm sáu cột uint16:

  • [0] loại sự kiện — xem bên dưới

  • [1] timestamp giây

  • [2] timestamp mili giây

  • [3] timestamp micro giây

  • [4] tọa độ X, 0-319

  • [5] tọa độ Y, 0-319

Driver phát sáu loại sự kiện trong cột [0]:

  • csi.PIX_OFF_EVENT — một điểm ảnh phát hiện giảm độ sáng (ngưỡng bộ so sánh DIFF_OFF đã bị vượt). X/Y trỏ đến điểm ảnh đã bắn.

  • csi.PIX_ON_EVENT — một điểm ảnh phát hiện tăng độ sáng (ngưỡng DIFF_ON đã bị vượt). X/Y trỏ đến điểm ảnh.

  • csi.EXT_TRIGGER_FALLING — chân trigger bên ngoài của cảm biến phát hiện cạnh xuống. X/Y không được sử dụng.

  • csi.EXT_TRIGGER_RISING — chân trigger bên ngoài của cảm biến phát hiện cạnh lên. X/Y không được sử dụng.

  • csi.RST_TRIGGER_FALLING — trigger reset điểm ảnh, cạnh xuống. X/Y không được sử dụng. Không được tạo ra bởi firmware vào thời điểm này.

  • csi.RST_TRIGGER_RISING — trigger reset điểm ảnh, cạnh lên. X/Y không được sử dụng. Không được tạo ra bởi firmware vào thời điểm này.

Đầu vào trigger bên ngoài của GENX320 được nối với đường frame-sync của camera, cũng được định tuyến đến P10 trên cả bộ xử lý và header chân — điều khiển P10 để đưa các cạnh đồng bộ vào luồng sự kiện và nhận chúng dưới dạng sự kiện EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING cùng với dữ liệu điểm ảnh.

Hầu hết các ứng dụng chỉ quan tâm đến PIX_OFF_EVENTPIX_ON_EVENT; các loại trigger cho phép bạn liên kết sự kiện với tín hiệu định thời bên ngoài.

Cấp phát bộ đệm sự kiện với shape (EVT_res, 6) trong đó EVT_res là lũy thừa của hai từ 1024 đến 65536, sau đó vào chế độ sự kiện qua csi.IOCTL_GENX320_SET_MODE với csi.GENX320_MODE_EVENT và kích thước bộ đệm. Đọc sự kiện bằng csi.IOCTL_GENX320_READ_EVENTS, điền vào bộ đệm đến hết dung lượng và trả về số hàng hợp lệ.

Image.draw_event_histogram rasterize các sự kiện thành một ảnh thang xám — với mỗi sự kiện ON, nó cộng thêm contrast vào bin; với mỗi sự kiện OFF, nó trừ đi. clear=True reset ảnh về brightness trước; clear=False tích lũy qua nhiều lần gọi:

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

img = image.Image(320, 320, image.GRAYSCALE)
events = np.zeros((2048, 6), dtype=np.uint16)

csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.ioctl(csi.IOCTL_GENX320_SET_MODE, csi.GENX320_MODE_EVENT, events.shape[0])

clock = time.clock()
while True:
    clock.tick()
    n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
    img.draw_event_histogram(events[:n], clear=True, brightness=128, contrast=64)
    img.flush()
    print(n, clock.fps())

Các presets bias chế độ histogram, bộ lọc AFK và các ioctls hiệu chỉnh điểm nóng đều hoạt động theo cùng cách trong chế độ sự kiện — gọi chúng sau csi.IOCTL_GENX320_SET_MODE.

Lọc theo cực tính

Cắt mảng sự kiện bằng ulab để chỉ giữ lại sự kiện ON (chuyển động sang trạng thái sáng hơn) hoặc chỉ sự kiện OFF:

TARGET = csi.PIX_ON_EVENT  # or csi.PIX_OFF_EVENT

events_slice = events[:n]
indices = np.nonzero(events_slice[:, 0] == TARGET)[0]
if len(indices):
    target_events = np.take(events_slice, indices, axis=0)
    img.draw_event_histogram(target_events, clear=True,
                             brightness=128, contrast=64)

Tích lũy phơi sáng dài

Đặt clear=False để tiếp tục tích lũy các sự kiện vào cùng một ảnh qua nhiều khung hình — kết quả là hình ảnh hóa vệt chuyển động. Đặt lại định kỳ để bắt đầu một lần phơi sáng mới:

EXPOSURE_FRAMES = 30
i = 0
while True:
    n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
    clear = (i % EXPOSURE_FRAMES) == 0
    img.draw_event_histogram(events[:n], clear=clear, brightness=128, contrast=64)
    img.flush()
    i += 1

Xử lý tốc độ cao

Bỏ hình ảnh hóa để giải phóng CPU cho xử lý sự kiện. Chỉ in thống kê mỗi N lần lặp — đẩy một dòng print mỗi lần lặp trở thành nút cổ chai ở tốc độ sự kiện cao:

csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.ioctl(csi.IOCTL_GENX320_SET_MODE, csi.GENX320_MODE_EVENT, events.shape[0])

clock = time.clock()
i = 0
while True:
    clock.tick()
    n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
    i += 1
    if not i % 10:
        print(f"{n} events  {clock.fps()} fps")

Bộ lọc tương phản không-thời gian (STC)

Một cạnh tương phản chuyển động thực sự có xu hướng kích hoạt một loạt sự kiện ồn ào trên cùng một điểm ảnh trong một cửa sổ thời gian ngắn — sự không khớp điểm ảnh và nhiễu tương tự tạo ra các sự kiện thừa xung quanh chuyển tiếp thực sự không hữu ích cho ứng dụng. Bộ lọc STC là một hậu xử lý on-chip giữ lại chỉ một (hoặc vài) sự kiện mỗi loạt và bỏ phần còn lại.

Nó triển khai ba chiến lược, được chọn qua csi.IOCTL_GENX320_SET_STC và một hằng số GENX320_STC_*. Mỗi chế độ được xác định bởi những sự kiện nào nó chuyển tiếp từ một loạt:

Chế độ

Giữ lại

Bỏ

csi.GENX320_STC_DISABLE

mọi sự kiện

không có gì

csi.GENX320_STC_ONLY

sự kiện thứ hai của một loạt

sự kiện đầu + sự kiện sau

csi.GENX320_STC_TRAIL_ONLY

sự kiện đầu tiên của một loạt

các sự kiện tiếp theo

csi.GENX320_STC_TRAIL

cạnh đầu + cạnh tiếp theo

chỉ nhiễu dư thừa

Chi tiết:

  • csi.GENX320_STC_DISABLE — bộ lọc tắt, mọi sự kiện đều đi qua (mặc định).

  • csi.GENX320_STC_ONLY — giữ lại sự kiện thứ hai của một loạt. Tham số: stc_threshold (ms). Nếu một sự kiện mới trên một điểm ảnh đến trong vòng stc_threshold của một sự kiện trước, nó được coi là "thứ hai" của một loạt và được chuyển tiếp — sự kiện đầu tiên và bất kỳ sự kiện tiếp theo nào trong cùng loạt đều bị lọc. Tốt nhất khi bạn muốn một chuyển tiếp được xác nhận bởi nhiễu hơn là lần nhấn đầu tiên.

  • csi.GENX320_STC_TRAIL_ONLY — giữ lại sự kiện đầu tiên của một loạt. Tham số: trail_threshold (ms). Sau khi một điểm ảnh bắn, các sự kiện tiếp theo trên cùng điểm ảnh đó bị bỏ cho đến khi trail_threshold đã trôi qua. Bảo toàn thời điểm chính xác của cạnh dẫn — hữu ích khi thời điểm chuyển cực tính quan trọng hơn xác nhận loạt.

  • csi.GENX320_STC_TRAIL — kết hợp cả hai. Tham số: stc_thresholdtrail_threshold (cả hai ms). Giữ lại cạnh dẫn theo chế độ Trail cộng với các cạnh tiếp theo theo chế độ STC, vì vậy nhiều sự kiện từ một loạt vẫn đi qua — thông lượng sự kiện cao hơn so với bộ lọc một chế độ nhưng tín hiệu phong phú nhất.

Hai ngưỡng phải ở trong tỷ lệ khoảng 13:1 — cảm biến từ chối các cấu hình trong đó một ngưỡng lớn hơn ~13 lần ngưỡng kia:

csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, 1, 2)
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)

Độ sâu bộ đệm

Khi tốc độ sự kiện tăng đột biến, pipeline triple-buffer mặc định ưu tiên khung hình mới nhất và bỏ các khung cũ. Tăng độ sâu FIFO qua csi.CSI.framebuffers để xếp hàng sự kiện thay thế — với chi phí xử lý dữ liệu cũ hơn một chút khi máy chủ bị chậm:

csi0.framebuffers(10)  # FIFO depth, > 3 enables queueing

Phát trực tuyến và hình ảnh hóa trên máy tính để bàn

Để hình ảnh hóa GUI thời gian thực trên máy tính PC, công cụ GenX320 Event Streaming trong repo openmv-projects ghép cam với giao diện DearPyGui. GUI PC chạy hai hình ảnh hóa song song: canvas tích lũy sự kiện (ý tưởng tương tự Image.draw_event_histogram nhưng với bảng màu có thể chọn và chế độ cửa sổ trượt vs. tự động xóa) và bản đồ tần số mỗi điểm ảnh được điều khiển bởi bộ lọc thông dải IIR — hữu ích để phát hiện tín hiệu định kỳ (quạt quay, LED nhấp nháy, v.v.) trực tiếp trong luồng sự kiện.

Nó đi kèm hai tập lệnh phát trực tuyến on-cam:

  • Chế độ xử lý (genx320_event_mode_streaming_on_cam.py) — cam giải mã sự kiện bằng csi.IOCTL_GENX320_READ_EVENTS và truyền mỗi hàng dưới dạng 12 byte qua USB ([0] type, [1] sec, [2] ms, [3] us, [4] x, [5] y). Dễ tiêu thụ trên PC vì định dạng dây khớp với định dạng ndarray on-cam.

  • Chế độ thô (genx320_raw_event_mode_streaming_on_cam.py) — cam truyền các từ sự kiện 32-bit đóng gói gốc của chip qua csi.IOCTL_GENX320_READ_EVENTS_RAW. Đó là 4 byte mỗi sự kiện so với 12 trong chế độ xử lý (ít hơn khoảng 3 lần dữ liệu qua USB), vì vậy ~3 lần tốc độ sự kiện có thể đạt được cao hơn khi liên kết là nút cổ chai. PC giải mã các từ đóng gói trở lại bố cục sự kiện 6 cột giống nhau bằng numpy vector hóa, vì vậy mã hình ảnh hóa downstream là giống hệt nhau.

Chế độ thô là mặc định trong GUI vì thông lượng USB là ràng buộc ràng buộc ở các tốc độ mà GenX320 có thể tạo ra; chuyển sang chế độ xử lý nếu bạn cần cắm logic xử lý vào tập lệnh on-cam.