DvsenseDriver  1.0.3
The SDK for dvsense products.
动态视觉相机使用教程

该部分介绍了如何通过 API 接口控制相机。并且介绍了 同步 和 异步 实时处理相机数据两种方法。

操控相机

在 DvsenseDriver 中,所有相机使用 dvsense::DvsCameraManager 类进行统一管理。

查找相机

// find all cameras
std::vector<dvsense::CameraDescription> cameraDescs = cameraManager.getCameraDescs();
相机管理器类
Definition: DvsCameraManager.hpp:35
std::vector< CameraDescription > getCameraDescs()
获取相机描述符向量

dvsense::CameraDescription 中包含相机的制造商、产品型号、序列号等信息。

可以通过**产品型号**来区分事件相机或融合相机。

打开事件相机

dvsense::DvsCameraManager::openCamera 接口可以使用序列号打开指定的事件相机

// Open the first camera found
dvsense::CameraDevice camera = cameraManager.openCamera(cameraDescs[0].serial);
CameraDevice openCamera(Serial serial)
使用给定的序列号打开相机。
DVSENSE_API std::shared_ptr< DvsCamera > CameraDevice
用于管理相机设备的共享指针
Definition: DvsCameraManager.hpp:28

dvsense::CameraDevice 是对 dvsense::DvsCamera 的易用性封装 typedef std::shared_ptr<DvsCamera> CameraDevice

开始和停止取流

打开相机后,相机默认是不进行取流的,需要手动开启。

注意!! 在取流开始之前,请参照下面的 获取并处理事件 注册 异步处理事件 的回调函数,或者设置 同步处理事件 的规则

camera->start(); // 开始取流
camera->stop(); // 停止取流

获取并处理事件

DvsenseDriver 中提供了两种获取和处理相机数据的方式,以适用于不同的需求和场景:

  • 异步方式:基于回调函数,实时性更好,但开发难度较高
  • 同步方式:开发简单,适用性广,但实时性较弱
    • 获取固定数量的事件
    • 获取固定时间的事件

同步处理方式和异步处理方式可以同时进行,但是同步方式中的两种获取事件的设定,只能同时使用一种。也就是说,可以既注册回调函数,也可以使用 dvsense::DvsCamera::getNextBatch 函数主动获取下一包数据。但是 dvsense::DvsCamera::getNextBatch 只能设定为 获取固定时间/数量 两种设定中的一种。

异步处理事件

相机提供了 dvsense::DvsCamera::addEventsStreamHandleCallback 接口,这个接口可以实时访问事件流。每当一小包事件完成传输和解码后,注册进入的回调函数就会被调用。

以下是一个使用示例,该示例中,对一张空白图片 img 中发生了事件的位置赋予颜色,以进行后续的可视化:

camera->addEventsStreamHandleCallback([&img](const dvsense::Event2D* begin, const dvsense::Event2D* end) {
// 执行某些操作或仅复制数据
for (auto it = begin; it != end; ++it) {
img.at<cv::Vec3b>(it->y, it->x) = (it->polarity) ? color_on : color_off;
}
});

警告:在使用回调函数接口时,必须尽可能减少回调函数的执行时间,否则会导致数据累积并导致程序崩溃。

您可以使用 dvsense::DvsCamera::addEventsStreamHandleCallback 函数添加多个回调函数,当事件流可用时,这些回调函数将按照注册顺序依次执行。您也可以记录回调函数的ID号,使用 dvsense::DvsCamera::addEventsStreamHandleCallback 的返回值,然后通过 dvsense::DvsCamera::removeEventsStreamHandleCallback 函数删除不再需要的回调函数。

auto cb_id = camera->addEventsStreamHandleCallback([](const dvsense::Event2D* begin, const dvsense::Event2D* end) {
// 执行某些操作或仅复制数据
});
camera->removeEventsStreamHandleCallback(cb_id);

同步处理事件

相机提供了 dvsense::DvsCamera::getNextBatch 接口,您可以设置获取事件的数量或时间,然后通过 dvsense::DvsCamera::getNextBatch 接口获取指定的事件数据。

如果您想获取固定数量的事件,您需要通过 dvsense::DvsCamera::setBatchEventsNum 接口预先设置所需的事件数量,

camera->setBatchEventsNum(1000); // 设置获取1000个事件

另外,如果您想获取固定时间段内的事件,您可以通过 dvsense::DvsCamera::setBatchEventsTime 接口设置所需的时间间隔,

camera->setBatchEventsTime(1000); // 示例:设置1000微秒的事件间隔

一旦设置完成,您需要通过调用 dvsense::DvsCamera::getNextBatch 接口来获取数据。

dvsense::Event2DVector events;
bool ret = camera->getNextBatch(events);
for (auto event : events) {
// Do something with the events
}

保存动态视觉传感器数据

在相机开始取流之后,可以使用 dvsense::DvsCamera::startRecordingdvsense::DvsCamera::stopRecording 将相机的原始数据流成 raw 文件,以便后续回放和处理。

camera->startRecording(out_file_path); // 开始录制
camera->stopRecording(); // 停止录制

下一节