これが壊れる理由についての情報を探しています。コンテキスト情報については補遺を参照してください。
std::vector<uint16_t> depth_buffer
640*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 です)、すべてがコピーされたのか、一部だけがコピーされたのかを判断するのは困難です。とはいえ、すべてを把握しているわけではないことはほぼ確実です。DepthCallback
Bus Error
lldb
runtime_error
std::copy
depth + 614400
depth + (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 チャネルを使用します。これは、このプロジェクトのニーズに適していません。
私はそれを無視して、ある意味で先に進むことができてうれしいです。なぜなら、これがうまくいかないからです。ご意見ありがとうございます。