该部分介绍了如何通过 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) {
}
注意!!这个函数返回的 std::shared_ptr<dvsense::Event2DVector> 不是线程安全的,并且在下次调用函数的时候,会被覆盖
跳转
对于已经加载过的文件,提供了寻找指定时间并跳转的接口 dvsense::DvsFileReader::seekTime 。可以首先通过 dvsense::DvsFileReader::getStartTimeStamp 和 dvsense::DvsFileReader::getEndTimeStamp 分别获取该文件中的起始时间戳和最后一个时间戳
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_reader_->getFileInfo(dvs_file_info_);
aps_reader_->getNextFrame(aps_frame);
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_);
TimeStamp aps_start_timestamp
定义 TypeUtils.hpp:13