我正在使用Kinect传感器,我想存储和加载它产生的数据。基本上它给了我两种类型的帧(颜色和深度),我保存到二进制文件。由于每个帧的大小超过1Mb,Kinect记录为30 fps,因此文件的增长速度非常快。
现在我需要一种有效的方法来加载数据并快速随机访问这些帧。
我现在这样做的方式是这样的:
Frame
类,其中包含一个帧头(帧号,时间戳,类型,数据大小)和指向实际图像数据的指针Replay
类,其中包含一个标题(帧数,分辨率等)和两个向量:frames
,其中包含Frame
个对象,数据指针初始化为NULL, framePositions
将帧编号映射到文件中的位置。
加载看起来像这样(压缩):
Replay replay;
Frame frame;
int position = fStream.tellg();
fStream.read((char *) &frame.header, sizeof(frame.header));
fStream.ignore(frame.dataSize); // skip image data for now
replay.insertFrame(frame, pos); // put frame and pos into vectors
所以这比将所有内容加载到内存中要好,但它仍然很慢。有一个名为Kinect Studio的MS软件,它可以立即打开录制的文件。从字面上看,我的解决方案需要几秒钟来加载类似大小的文件。这是什么样的巫术?
现在我有了一个想法:在文件中创建一个帧位置数组,将它放在文件的末尾(因为它是可变大小),将其偏移量和大小放在标题中,不要甚至无法加载帧,只需加载阵列并在需要时请求帧。
我认为它可行,但我决定在尝试实施之前寻求建议,因为我相信有解决这些问题的标准方法,我真的不想通过反复试验重新发明轮子。 / p>