05 显示与可视化
任务目标
事件是稀疏的异步点 (x, y, polarity, t),肉眼无法直接"看"出运动。最常用的可视化方法是把一段时间内的事件累加成一帧图像显示出来。本页讲用 OpenCV 实现的累加显示,以及免写代码的可视化方案。
涉及概念
- 累加成帧(accumulation):把一段时间窗口内的事件按坐标画到一张图上,运动轨迹就显现出来。时间窗口长度叫 accumulation time,见 基础原理。
- 极性着色:
EventCD.polarity为true(变亮)与false(变暗)用不同颜色区分。 - 传感器尺寸从
Frame.width/Frame.height取(USB/MIPI 均为 768×608)。
事件累加成帧 + OpenCV 显示
取帧 → 解码事件 → 按坐标画到 cv::Mat,主循环按固定周期刷新并清空(清空周期即 accumulation time):
#include <shimetapi/hv/camera.h>
#include <shimetapi/hv/device_config.h>
#include <shimetapi/codec/evt2_codec.h>
#include <opencv2/opencv.hpp>
int main() {
Shimeta::hv::Camera cam;
Shimeta::hv::DeviceConfig cfg;
cfg.backend = Shimeta::hv::Backend::Usb;
cfg.vendor_id = 0x1d6b;
cfg.product_id = 0x0105;
cfg.event_fmt = Shimeta::hv::EventFormat::Evt2;
cam.Init(cfg);
if (!cam.StartStream()) return 1;
cv::Mat frame(608, 768, CV_8UC3, cv::Scalar(0, 0, 0));
Shimeta::codec::Evt2Decoder dec; // 有状态,循环外构造
Shimeta::Frame f;
while (true) {
if (cam.GetFrame(f, 33)) {
std::vector<Shimeta::EventCD> events;
dec.Decode(f.evs.data, f.evs.size, events);
for (const auto& e : events) {
if (e.polarity) frame.at<cv::Vec3b>(e.y, e.x) = {0, 0, 255}; // 变亮:红
else frame.at<cv::Vec3b>(e.y, e.x) = {0, 255, 0}; // 变暗:绿
}
}
cv::imshow("events", frame);
if (cv::waitKey(33) == 27) break; // ESC 退出
frame = cv::Scalar(0, 0, 0); // 清空 = 固定 accumulation time
}
cam.StopStream();
cam.Destroy();
return 0;
}accumulation time 的两种调法
- 清空周期(上面代码的方式):固定每帧清空,刷新间隔即 accumulation time。简单直观。
- 时间衰减:不清空,按事件时间戳
e.t衰减旧像素,画面呈拖影。更平滑但实现稍复杂。 画面"糊"就缩短 accumulation;画面"空"就延长 accumulation,详见 指引 06 调参。
MIPI HVS
把 EVT2 解码器换成 MipiRaw8Decoder(Frame.evs 为 apx003 RAW8 子帧流),其余累加 / 显示逻辑不变:
Shimeta::codec::MipiRaw8Decoder dec; // 无状态
// dec.Decode(f.evs.data, f.evs.size, events); → 同样的 events,按上面方式累加绘制S100 与 X5 的 EVS 可视化逻辑相同,均使用 MipiRaw8Decoder;仅 APS 显示格式不同(S100 为 NV12,X5 为 Gray8),见指引 07。
光流可视化
EVS 光流可视化(每像素运动方向向量)参考 Windows Algo SDK 的 OpticalFlow 示例 showOf,见 Windows Algo SDK 与 示例总览。
免代码方案
不想写代码也能可视化:用我方上位机 MultiVision Studio 直接实时预览,或用 Toolkit 自带的 viewer 示例(仓库 samples/cpp/viewer)回放 raw 文件(见 Toolkit)。
进阶
- APS 图像帧 API:指引 07 采集 APS 图像
- 画面糊/空的调参决策:指引 06 调参
- 累加原理:基础原理
- 累加方案(full/over/under)与帧率配合:事件可视化
