0

これが壊れる理由についての情報を探しています。コンテキスト情報については補遺を参照してください。

std::vector<uint16_t> depth_buffer640*480 要素を持つように初期化された があります。これは、占有する合計スペースが であることを意味します640*480*sizeof(uint16_t) = 614400

壊れるコード:

void Kinect360::DepthCallback(void* _depth, uint32_t timestamp) {
    lock_guard<mutex> depth_data_lock(depth_mutex);

    uint16_t* depth = static_cast<uint16_t*>(_depth);
    std::copy(depth, depth + depthBufferSize(), depth_buffer.begin());/// the error
    new_depth_frame = true;
}

wheredepthBufferSize()は 614400 を返します (これは何度も確認しました)。

私の理解でstd::copy(first, amount, out)は、firstコピーを開始するメモリアドレスを指定し、コピーするまでamountバイト数を指定し、コピーを開始するメモリアドレスを指定します。out

もちろん、次のような方法で手動で行うこともできます

#pragma unroll
for(auto i = 0; i < 640*480; ++i) depth_buffer[i] = depth[i];

への呼び出しの代わりに、なぜここで失敗std::copyするのか本当に混乱しています。std::copy何かご意見は???


FreenectDevice補遺: コンテキストは、Kinect 360 で動作するようにを継承する派生クラスを書いているということBus Errorです。でステップスルーすると、からスローされている標準です。手動で入力するとクラッシュしますが、持っているとぐちゃぐちゃになります。この段階では、深度データで意味のあることを行っていないため (OpenGL を使用して生の深度を適切にレンダリングすることは別の問題 xD です)、すべてがコピーされたのか、一部だけがコピーされたのかを判断するのは困難です。とはいえ、すべてを把握しているわけではないことはほぼ確実です。DepthCallbackBus Errorlldbruntime_errorstd::copydepth + 614400depth + (640*480)

VideoCallbackの対応する呼び出しとは対照的にcopy(video, video + videoBufferSize(), video_buffer.begin())、上記がクラッシュする理由がわかりません。私の理解std::copyが間違っていた場合、videoBufferSize()が返されるため、これもクラッシュするはず640*480*3*sizeof(uint8_t) = 640*480*3 = 921600です。これ*3は、uint8_tピクセルごとに 3 つの RGB (A なし) があるためです。OpenGL で検証されているように (そしてVideoCallback、libfreenect で提供されているサンプルと本質的に同一であるという事実...)、問題なく動作します。参考までに、実際に生の深度データを直接操作するサンプルは見つかりませんでした。それらはすべて、深度を色付けし、std::vector<uint8_t>RGB チャネルを使用します。これは、このプロジェクトのニーズに適していません。


私はそれを無視して、ある意味で先に進むことができてうれしいです。なぜなら、これがうまくいかないからです。ご意見ありがとうございます。

4

1 に答える 1