04 事件处理(去噪)
去噪算法运行在应用层。事件采集本身支持 x86_64 USB、S100/X5 MIPI;具体算法是否能在 ARM 板卡运行,取决于 Algo 组件的交叉编译和依赖,不由 HV Toolkit 自动保证。
任务目标
事件相机即使在静止场景下也会持续产生少量背景活动噪声,与真实运动事件混在一起。去噪判断每个事件是信号还是噪声并丢弃噪声,是几乎所有事件相机算法管线的第一步。本页讲通用接口模式与算法选用。
涉及类与概念
去噪算法都在 Shimeta::Algorithm::Denoise 命名空间下(见 Algo API),统一接口模式:
- 构造:传入算法参数;
initialize():初始化内部状态;process_events(events):批量处理,返回去噪后的事件向量;- (部分算法)
evaluate(event):评估单个事件。
7 种去噪算法选用
| 算法 | 核心思想 | 适用场景 | 算力 |
|---|---|---|---|
DoubleWindowFilter | 双时间窗统计邻近事件 | 通用入门、低算力 | 低 |
EventFlowFilter | 事件流速特征 | 有明确运动的场景 | 中 |
KhodamoradiDenoiser | 经典时空邻域 | 离线、对照基线 | 低 |
YangNoiseFilter | 时空密度 | 一般运动场景 | 中 |
TimeSurfaceDenoisor | 时间表面特征 | 纹理/边缘丰富场景 | 中 |
ReclusiveEventDenoisor | 递归时空 | 需要状态连续性 | 中 |
MultiLayerPerceptronFilter | 神经网络分类 | 高精度(需 PyTorch / 可选 GPU) | 高 |
各算法对应的可运行示例见 示例总览,选型建议见 Hybrid Vision Algo。
单算法处理
以双窗口滤波为例。当前 Algo API 的公开签名仍是 Metavision::EventCD,因此它不是 HV Toolkit v2.0 的原生类型;应用需要在 Shimeta::EventCD 与 Algo 输入类型之间提供自己的转换层。
#include <shimetapi/hv/camera.h>
#include <shimetapi/codec/mipi_raw8_codec.h>
#include <denoise/double_window_filter.h>
#include <metavision/sdk/base/events/event_cd.h>
#include <vector>
Shimeta::Algorithm::Denoise::DoubleWindowFilter dwf(36, 9, 1);
dwf.initialize();
// events 是转换层输出的 Algo 输入事件
std::vector<Metavision::EventCD> events;
auto filtered = dwf.process_events(events);
// filtered 即去噪后的事件接入 v2.0 相机时,先取得原始字节并用对应 codec 解码,再对每批事件去噪。USB 使用 Evt2Decoder/Evt3Decoder;S100/X5 的 MipiHvs 使用 MipiRaw8Decoder。
// 接入流程示意:convert_to_algo_events 需由应用按 Algo SDK 定义实现
Shimeta::codec::MipiRaw8Decoder dec; // S100/X5;USB 改用 Evt2Decoder
cam.SetFrameCallback([&dwf, &dec](const Shimeta::Frame& frame) {
std::vector<Shimeta::EventCD> shimeta_events;
dec.Decode(frame.evs.data, frame.evs.size, shimeta_events);
// 将 shimeta_events 转换为 Algo API 要求的 Metavision::EventCD
// convert_to_algo_events 为应用自定义适配函数(此处仅示意)
std::vector<Metavision::EventCD> events = convert_to_algo_events(shimeta_events);
auto filtered = dwf.process_events(events);
// 用 filtered 做后续处理
});构造参数含义:bufferSize(缓冲长度)、searchRadius(邻域半径)、intThreshold(判定为信号所需的最小邻近事件数)。各算法参数详见 Algo API。
多算法串联
不同算法的强项可以叠加——把前一级的输出作为后一级的输入:
#include <denoise/double_window_filter.h>
#include <denoise/yang_noise_filter.h>
Shimeta::Algorithm::Denoise::DoubleWindowFilter dwf(36, 9, 1);
Shimeta::Algorithm::Denoise::YangNoiseFilter ynf(768, 608, 10000, 1, 2);
dwf.initialize();
ynf.initialize();
std::vector<Metavision::EventCD> events;
auto step1 = dwf.process_events(events); // 第一级
auto step2 = ynf.process_events(step1); // 第二级串联会逐级丢事件
每级都会按自己的准则丢弃部分事件。串联越多保留率越低,需在“干净”与“信息完整”之间权衡,按场景调参。
编译要求
C++17、CMake ≥ 3.16、Metavision SDK、Eigen3;启用 MultiLayerPerceptronFilter 还需 PyTorch C++ 库(cmake -DENABLE_TORCH=ON ..)。详见 Algo API — 编译要求。
进阶
- 完整 API 与各算法参数:Algo API
- 每种算法对应的可运行示例:示例总览
- 去噪后做可视化:指引 05 显示与可视化
