2

我正在使用 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 软件,它可以立即打开录制的文件。从字面上看是瞬间,而我的解决方案需要几秒钟来加载类似大小的文件。这是什么魔法?

现在我有了以下想法:在文件中创建一个帧位置数组,将其放在文件末尾(因为它将是可变大小),将其偏移量和大小放在标题中,甚至不用费心加载帧,只需加载数组并在需要时请求帧。

我认为它可以工作,但我决定在尝试实施之前寻求建议,因为我相信有处理此类问题的标准方法,我真的不想通过反复试验来重新发明轮子。

4

0 回答 0