2

私は Kinect センサーを使用しており、それが生成するデータを保存してロードしたいと考えています。基本的に、バイナリ ファイルに保存する 2 種類のフレーム (色と深度) が得られます。各フレームのサイズは 1Mb 強で、Kinect は 30 fps で記録するため、ファイルは急速に大きくなる傾向があります。

ここで、データをロードし、フレームへの高速ランダム アクセスを行うための効率的な方法が必要です。

私が今それをやった方法は次のようなものです:

  • Frameフレームヘッダー(フレーム番号、タイムスタンプ、タイプ、データサイズ)と実際の画像データへのポインターを含むクラスがあります
  • Replayヘッダー(フレーム数、解像度など)と2つのベクトルを含むクラスがあります。これには、NULLに初期化されたデータポインターを持つオブジェクトframesが含まれ、フレーム番号がファイル内の場所にマップされます。 FrameframePositions
    • フレームが必要な場合は、ファイルからデータをロードするだけです。

読み込みは次のようになります (圧縮):

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