私はかなり長い間この問題に取り組んできましたが、私の創造性の終わりにあるので、他の誰かが私を正しい方向に向けるのを手伝ってくれることを願っています. Kinect を使用して、データを MATLAB にキャプチャしようとしています。幸いなことに、そうする方法はかなりあります (私は現在http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlabを使用しています)。キャプチャしたデータを 3D に投影しようとしたとき、従来の方法では再構成の結果が不十分でした。
簡単に言うと、再構成と位置合わせを実行する matlab 用の Kinect SDK ラッパーを作成することになりました。復興は夢のようですが…
あなたがここで見ることができるように、私は整列にたくさんの問題を抱えています:
モデルをよく見ないでください:(。
ご覧のとおり、配置が正しくありません。なぜそうなのかはわかりません。私は、他の人が同じ方法で私よりも多くの成功を収めているフォーラムをたくさん読みました。
私の現在のパイプラインは、Kinect 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 ];
}
}