DvsenseDriver  1.1.2-Alpha
The SDK for dvsense products.
载入中...
搜索中...
未找到
文件读取使用教程

该部分介绍了如何通过 API 接口读取录制下来的文件。

DVS文件读取

APS文件读取

DVS APS 数据同步

DVS(.raw)文件文件读取

SDK 支持读取 .raw 文件格式。该 raw 文件中记录的从动态视相机中直接获取的未经解码的数据。编码方式为 EVT3.0

文件加载与使用

文件读取相关头文件位于 DvsenseDriver/FileReader/DvsFileReader.h

文件加载

可以通过 dvsense::DvsFileReader::createFileReader 创建 dvsense::DvsFile 的实例,通过它加载数据和处理数据。dvsense::DvsFile 是对 dvsense::DvsFileReader 的易用性封装 typedef DVSENSE_API std::unique_ptr<DvsFileReader> DvsFile;

reader->loadFile();
static std::unique_ptr< DvsFileReader > createFileReader(std::string filepath)
创建一个文件读取器对象
DVSENSE_API std::unique_ptr< DvsFileReader > DvsFile
用于管理DVS文件读取器的unique_ptr
定义 DvsFileReader.h:287

请注意,reader 在构造之后并不直接加载数据,需要手动调用 dvsense::DvsFileReader::loadFile 加载文件数据 函数的运行时间取决于文件的大小。

数据读取接口

dvsense::DvsFileReader 中提供两种接口对数据进行读取:

调用这两个接口的时候,dvsense::DvsFileReader 内的文件指针也会进行相应调整。

std::shared_ptr<dvsense::Event2DVector> events = reader->getNTimeEvents(2000);
for (auto& event : *events) {
// do something
}

‍注意!!这个函数返回的 std::shared_ptr<dvsense::Event2DVector> 不是线程安全的,并且在下次调用函数的时候,会被覆盖

跳转

对于已经加载过的文件,提供了寻找指定时间并跳转的接口 dvsense::DvsFileReader::seekTime 。可以首先通过 dvsense::DvsFileReader::getStartTimeStampdvsense::DvsFileReader::getEndTimeStamp 分别获取该文件中的起始时间戳和最后一个时间戳

dvsense::TimeStamp start_timestamp, end_timestamp;
reader->getStartTimeStamp(start_timestamp);
reader->getEndTimeStamp(end_timestamp);
reader->seekTime(start_timestamp);
uint64_t TimeStamp
定义 TypeUtils.hpp:8

裁剪

通过调用 extractEventData 接口可以对已经导入的文件进行裁剪,输入参数为:起始时间戳、结束时间戳、输出文件完整路径,以下是裁剪示例:

reader->extractEventData(start_timestamp, end_timestamp, "./extract.raw");

导出

通过调用 exportEventDataToVideo 接口可以对已经导入的文件进行视频导出,输出转换后mp4文件,输入参数为:起始时间戳、结束时间戳、输出文件完整路径

reader->exportEventDataToVideo(start_timestamp, end_timestamp, "./export.mp4");

‍注意:在导出过程中不能对文件进行其他读取操作,否则会出现导出错误问题。

获取dvs文件信息

dvs_reader_->getFileInfo(dvs_file_info_);

APS(.mp4)文件读取

融合相机在保存融合数据时,会将收到的RGB数据编码为mp4文件格式来保存。

以下介绍通过调用SDK的API接口来读取mp4文件

文件加载

在mp4文件导入时依旧沿用了dvs的处理接口

std::shared_ptr<dvsense::ApsFileReader> aps_reader_ = dvsense::ApsFileReader::createFileReader("aps.mp4");
aps_reader_->loadFile();

数据获取

获取mp4图像分辨率

aps_width_ = aps_reader_->getWidth();
aps_height_ = aps_reader_->getHeight();

获取下一帧ApsFrame

dvsense::ApsFrame aps_frame;
aps_reader_->getNextFrame(aps_frame);

根据时间戳获取ApsFrame

dvsense::ApsFrame aps_frame;
aps_reader_->getFrameGivenTimeStamp(0, aps_frame);

根据帧数获取时间戳

dvsense::ApsFrame aps_frame;
aps_reader_->getNFrame(0, aps_frame);

跳转

aps_reader_->seekTime(0);

获取mp4时间戳

通过调用以下接口,可以获取整个mp4文件中每一帧的时间戳

std::vector<dvsense::TimeStamp> mp4_ts;
aps_reader_->getTimeStamps(mp4_ts);

DVS APS文件数据同步

以下为事件流跟图像流的同步示例:

uint64_t mp4_ts_offset = 0;
//通过dvs获取dvs的文件信息
dvsense::DvsFileInfo dvs_file_info_;
dvs_reader_->getFileInfo(dvs_file_info_);
mp4_ts_offset = dvs_file_info_.aps_start_timestamp; //通过获取dvs文件信息,来获取mp4文件保存时刻的dvs时间
aps_reader_->getNextFrame(aps_frame);
// 通过mp4_ts_offset来计算每一帧mp4数据对应的dvs时间戳
uint64_t dvs_ts = aps_frame.exposure_end_timestamp + mp4_ts_offset;
// 获取对应时间段的事件
std::shared_ptr<dvsense::Event2DVector> events;
events = dvs_reader_->getNTimeEventsGivenStartTimeStamp(dvs_ts - dvs_events_accumu_time_interval_,
dvs_events_accumu_time_interval_);
// 获取到了aps数据与dvs数据,进行融合处理即可
TimeStamp aps_start_timestamp
定义 TypeUtils.hpp:13
定义 TypeUtils.hpp:10