Camera Sự Kiện GENX320¶
Module Camera Sự Kiện GENX320 là cảm biến thị giác dựa trên sự kiện của Prophesee với độ phân giải 320x320 và độ chính xác thời gian ở mức micro giây.
Để xem bảng thông số kỹ thuật đầy đủ, ảnh và thông tin đặt hàng, vui lòng truy cập trang sản phẩm Camera Sự Kiện GENX320.
Ghi chú
Hỗ trợ trên OpenMV H7 Plus, RT1062 và N6.
Tính năng nổi bật¶
Cảm biến thị giác dựa trên sự kiện 320x320
Dải động 140 dB, không bị nhòe chuyển động
Tốc độ xuất histogram sự kiện 375 Hz+
Công suất tỷ lệ theo hoạt động cảnh — bắt đầu từ ~3 mW
Hoạt động từ <5 lux đến ánh sáng mặt trời chói chang mà không cần tự điều chỉnh phơi sáng
Xuất khung hình thang xám hoặc luồng sự kiện thô
Cách dùng¶
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 đồng hồ khung hình cố định, mỗi điểm ảnh báo cáo các "sự kiện" bất đồng bộ ngay khi 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à dấu thời gian micro giây. Đó là nguồn gốc của độ chính xác thời gian micro giây, không bị nhòe chuyển động, dải động rất cao, và mức tiêu thụ điện tỷ lệ theo hoạt động của cảm biến. Các 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 trên chip vào các bin theo từng điểm ảnh và được 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, do đó 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
ndarraynumpy với dấu thời gian micro giây đầy đủ, dành cho các ứng dụng cần chi tiết thời gian thay vì khung hình đã được 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), phía dưới là sự kiện OFF (độ sáng giảm). Độ 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àm nổi bật các 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.contrast, và csi.CSI.framerate là ba thông số định hình đầu ra histogram.
Đầu ra 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 phát ra các khung hình RGB565 sử dụng trực tiếp bảng màu:
csi0.color_palette(image.PALETTE_EVT_LIGHT)
Hiệu chỉnh điểm ảnh nóng¶
Các cảm biến sự kiện tích lũy "điểm ảnh nóng" kích hoạt giả tạo. 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 truy cập 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 truy cập vượt quá mean + sigma * stddev — sau đó các điểm ảnh bị vô hiệu hóa sẽ ngừng phát ra sự kiện ở cấp độ cảm biến.
Hai tham số kiểm soát quá trình 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 nắm bắt các khung hình cho đến khi tổng sự kiện đang chạy vượt qua ngân sách này. Số lần đếm cao hơn cho kết quả ước tính đáng tin cậy hơn nhưng tốn nhiều thời gian hiệu chỉnh hơn.10000là đ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 tích cực hơn (nhiều điểm ảnh bị vô hiệu hóa hơn); giá trị cao hơn bảo thủ hơn.0.5là giá trị mặc định tốt.
Hướng cảm biến vào một cảnh tĩnh trước để các sự kiện do chuyển động không được tính vào các điểm ảnh thực sự tốt:
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 khối lượng lớn sự kiện dư thừa. Bộ lọc AFK loại bỏ các sự kiện có điểm ảnh bật/tắt ở 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
Cài đặt thiên lệch¶
Mỗi điểm ảnh trong GenX320 chạy một front-end analog với một số thiên lệch có thể cấu hình. Chúng cùng nhau điều chỉnh độ 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 thiên lệch 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 lên nhiều. 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 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 có nhiều hoạt động nhiễu nền 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 — khoảng thời gian trơ. Sau khi một điểm ảnh kích hoạt, nó ở trạng thái reset trong thời gian này trước khi có thể kích hoạt 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 trê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 giá trị mặc định trong bảng thông số kỹ thuật phát ra tốc độ sự kiện nền cao hơn nhiều, do đó LOW_NOISE được sử dụng làm điểm khởi đầu để giữ luồng yên tĩnh. Gọi csi.IOCTL_GENX320_SET_BIASES với một cài đặt khác khi ứng dụng cần thêm độ nhạy hoặc băng thông.
csi.IOCTL_GENX320_SET_BIASES áp dụng một trong năm cài đặt:
csi.GENX320_BIASES_DEFAULT— Giá trị mặc định trong bảng thông số kỹ thuật GenX320. Độ nhạy, nhiễu và băng thông cân bằng cho các cảnh chung.csi.GENX320_BIASES_LOW_LIGHT— cả hai ngưỡng tương phản được nới lỏng để tăng độ nhạy, FO giảm xuống để kiểm soát nhiễu, và HPF được đặt thành 0 để các thay đổi độ sáng chậm vẫn được ghi nhận — cảnh ánh sáng yếu tự tạo ra rất í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 các đèn LED nhấp nháy có độ tương phản cao. Ngưỡng tương phản được tăng lên để chỉ có các chuyển tiếp sắc nét mới kích hoạt; FO và HPF được tăng cao để tối đa hóa băng thông điểm ảnh và loại bỏ bất kỳ sự trôi dạt chậm của môi trường xung quanh; REFR được 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 cạnh LED, dễ theo dõi.csi.GENX320_BIASES_LOW_NOISE— mặc định của driver. Cả hai ngưỡng tương phản được tăng so vớiDEFAULT(ít nhạy hơn) và FO giảm (đ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 mà nếu không sẽ bị các sự kiện sai chiếm ưu thế.csi.GENX320_BIASES_HIGH_SPEED— FO tăng lên để mỗi điểm ảnh có thể phản hồi nhanh hơn, HPF tăng để loại bỏ sự trôi dạt độ sáng chậm, và REFR tăng để một cạnh chuyển động nhanh không làm tràn ngập đầu ra — thời gian chết dài hơn giữ cho khối lượng sự kiện được giới hạn dưới chuyển động nặng.
Ghi đè các thiên lệch riêng lẻ với 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 thiên lệch được đặt độc lập — chọn một cài đặt làm điểm khởi đầu, sau đó điều chỉnh bất kỳ thiên lệch nào 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 của 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 đèn LED active-marker, tải cài đặt thiên lệch active-marker và tìm các vùng màu (blob) ở đầ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 trên 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]dấu thời gian giây[2]dấu thời gian mili giây[3]dấu thời gian micro giây[4]tọa độ X, 0-319[5]tọa độ Y, 0-319
Driver phát ra 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ánhDIFF_OFFđã bị vượt qua). X/Y trỏ đến điểm ảnh đã kích hoạt.csi.PIX_ON_EVENT— một điểm ảnh phát hiện tăng độ sáng (ngưỡngDIFF_ONđã bị vượt qua). X/Y trỏ đến điểm ảnh.csi.EXT_TRIGGER_FALLING— chân kích hoạt 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 kích hoạt 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— kích hoạt reset điểm ảnh, cạnh xuống. X/Y không được sử dụng. Hiện tại không được firmware tạo ra.csi.RST_TRIGGER_RISING— kích hoạt reset điểm ảnh, cạnh lên. X/Y không được sử dụng. Hiện tại không được firmware tạo ra.
Đầu vào kích hoạt 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à đầu nối 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 như các 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_EVENT và PIX_ON_EVENT; các loại kích hoạt cho phép bạn tương quan các sự kiện với các tín hiệu thời gian bên ngoài.
Phân bổ bộ đệm sự kiện với hình dạng (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 với csi.IOCTL_GENX320_READ_EVENTS, lấp đầy bộ đệm đến dung lượng của nó 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 — đối với mỗi sự kiện ON, nó cộng thêm contrast vào bin; đối với mỗi sự kiện OFF, nó trừ đi. clear=True đặt lại ả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 cài đặt thiên lệch chế độ histogram, bộ lọc AFK và các ioctl hiệu chỉnh điểm ảnh nóng đều hoạt động theo cùng một 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 các sự kiện ON (chuyển động sang trạng thái sáng hơn) hoặc chỉ các 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 xếp chồng 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 trực quan 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ỏ phần trực quan hóa để giải phóng CPU cho việc xử lý sự kiện. Chỉ in thống kê mỗi lần lặp thứ N — đẩy một dòng in 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 nhiễu 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 analog tạo ra các sự kiện thêm 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ý trên chip chỉ giữ lại một (hoặc một vài) sự kiện mỗi loạt và loại bỏ phần còn lại.
Nó thực hiện ba chiến lược, được chọn qua csi.IOCTL_GENX320_SET_STC và 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 |
Loại bỏ |
|---|---|---|
mọi sự kiện |
không có gì |
|
sự kiện thứ hai của một loạt |
sự kiện đầu tiên + sự kiện sau |
|
sự kiện đầu tiên của một loạt |
các sự kiện tiếp theo |
|
cạnh đầu tiên + các cạnh tiếp theo |
chỉ nhiễu dư thừa |
Chi tiết:
csi.GENX320_STC_DISABLE— tắt bộ lọc, 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òngstc_thresholdcủ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 đó bị lọc ra. Tốt nhất khi bạn muốn một chuyển tiếp được xác nhận bởi nhiễu thay vì lần truy cập đầ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 kích hoạt, các sự kiện tiếp theo trên cùng điểm ảnh đó bị loại bỏ cho đến khitrail_thresholdđã trôi qua. Bảo tồn thời gian chính xác của cạnh dẫn — hữu ích khi thời điểm chuyển đổi 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_thresholdvàtrail_threshold(cả hai tính bằng 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 các bộ lọc một chế độ nhưng tín hiệu phong phú nhất.
Hai ngưỡng phải duy trì trong tỷ lệ xấp xỉ 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à loại bỏ các khung hình cũ. Tăng độ sâu FIFO qua csi.CSI.framebuffers để xếp hàng các sự kiện thay vì — với chi phí là xử lý dữ liệu cũ hơn một chút khi host bị tụt lại:
csi0.framebuffers(10) # FIFO depth, > 3 enables queueing
Truyền trực tiếp máy tính để bàn và trực quan hóa¶
Để trực quan hóa GUI thời gian thực trên PC, công cụ GenX320 Event Streaming trong repo openmv-projects kết hợp cam với front-end DearPyGui. GUI PC chạy hai chế độ trực quan hóa cạnh nhau: canvas tích lũy sự kiện (cùng ý tưởng như Image.draw_event_histogram nhưng với các bảng màu có thể chọn và chế độ cửa sổ trượt so với auto-clear) và bản đồ tần số theo từng điểm ảnh được điều khiển bởi bộ lọc band-pass IIR — hữu ích để phát hiện các tín hiệu tuần hoàn (quạt quay, đèn 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 truyền trực tiếp trên cam:
Chế độ đã xử lý (
genx320_event_mode_streaming_on_cam.py) — cam giải mã các sự kiện vớicsi.IOCTL_GENX320_READ_EVENTSvà truyền mỗi hàng dưới dạng 12 byte qua USB ([0]loại,[1]giây,[2]ms,[3]us,[4]x,[5]y). Dễ dàng sử dụng trên PC vì định dạng dây khớp với định dạng ndarray trên cam.Chế độ thô (
genx320_raw_event_mode_streaming_on_cam.py) — cam truyền các từ sự kiện đóng gói 32-bit gốc của chip quacsi.IOCTL_GENX320_READ_EVENTS_RAW. Đó là 4 byte mỗi sự kiện so với 12 trong chế độ đã xử lý (khoảng ít dữ liệu hơn 3 lần qua USB), vì vậy tốc độ sự kiện đạt được cao hơn ~3 lầ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 cách sử dụng numpy được vector hóa, vì vậy mã trực quan hóa hạ lưu hoàn toàn giống 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 kết nối logic xử lý vào tập lệnh trên cam.