私はかなり長い間この問題に取り組んできましたが、私の創造性が終わったので、他の誰かが私に正しい方向を教えてくれることを願っています。私はKinectと協力し、MATLABにデータをキャプチャしようとしています。幸いにも、これを行う方法はかなりあります(私は現在http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlabを使用しています)。キャプチャしたデータを3Dに投影しようとすると、私の伝統的な方法では再構成結果が悪くなりました。なぜキンクの色と深度が正しく整列しないのですか?
短いストーリーを短縮するために、私は、再構成とアライメントを実行するmatlab用のKinect SDKラッパーを作成しました。復興はあなたがここに見ることができるように私は、アライメントとのトラブルのトンを持っています
を夢のように動作しますが、...:
モデルであまりよく見ないでください。 (あなたが見ることができるように。
、アライメントが正しくありません。それが事実だ、なぜ私はよく分からない。私は他の人が同じ方法で私よりも多くの成功を収めているフォーラムをたくさん読んだ。
現在のパイプラインでKiを使用していますMatlab(Openniを使用)を使用してデータをキャプチャし、Kinect SDKを使用して再構築した後、Kinect SDKを使用して整列します(NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolutionによる)。私はそれがおそらくOpenniに起因すると思っていましたが、Kinect SDKを使用してキャプチャするmex関数呼び出しの作成にほとんど成功しませんでした。
誰かが私をより深く掘り下げるべき方向に向けることができれば、非常に感謝しています。
編集:
図はコードを投稿する必要があります。これは私が、アライメントに使用するコードです:
/* The matlab mex function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
const mxArray *prhs[]){
if(nrhs < 2)
{
printf("No depth input or color image specified!\n");
mexErrMsgTxt("Input Error");
}
int width = 640, height = 480;
// get input depth data
unsigned short *pDepthRow = (unsigned short*) mxGetData(prhs[0]);
unsigned char *pColorRow = (unsigned char*) mxGetData(prhs[1]);
// compute the warping
INuiSensor *sensor = CreateFirstConnected();
long colorCoords[ 640*480*2 ];
sensor->NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution(
NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480,
640*480, pDepthRow, 640*480*2, colorCoords);
sensor->NuiShutdown();
sensor->Release();
// create matlab output; it's a column ordered matrix ;_;
int Jdimsc[3];
Jdimsc[0]=height;
Jdimsc[1]=width;
Jdimsc[2]=3;
plhs[0] = mxCreateNumericArray(3, Jdimsc, mxUINT8_CLASS, mxREAL);
unsigned char *Iout = (unsigned char*)mxGetData(plhs[0]);
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++){
int idx = (y*width + x)*2;
long c_x = colorCoords[ idx + 0 ];
long c_y = colorCoords[ idx + 1 ];
bool correct = (c_x >= 0 && c_x < width
&& c_y >= 0 && c_y < height);
c_x = correct ? c_x : x;
c_y = correct ? c_y : y;
Iout[ 0*height*width + x*height + y ] =
pColorRow[ 0*height*width + c_x*height + c_y ];
Iout[ 1*height*width + x*height + y ] =
pColorRow[ 1*height*width + c_x*height + c_y ];
Iout[ 2*height*width + x*height + y ] =
pColorRow[ 2*height*width + c_x*height + c_y ];
}
}
あなたの質問に対する回答が関連していて、自分の問題を解決したかどうかを他人に知らせるべきです。そうでない場合はなぜですか?それがこのコミュニティの仕組みです。 – masad
masadに:はい、あなたの返事に感謝します。あなたの答えがまだ働いているかどうかを確認する機会はありませんでしたが、今私はそうしています。あなたはちょっとだけ教えてくれます。 – vsector