我已经花了很长时间解决这个问题,但创意已经用尽,希望有人能指点我正确的方向。我一直在使用Kinect并试图将数据捕获到MATLAB中。幸运的是,有很多方法可以做到这一点(我目前正在使用http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab)。当我试图将捕获的数据投影到三维时,我的传统方法给出了差劲的重建结果。
简而言之,我编写了一个Kinect SDK包装器,用于MATLAB执行重建和对齐操作。重建非常完美,但是对齐存在许多问题,如下所示:
请不要太仔细地观察模型:(。
可以看到,对齐是不正确的。我不确定为什么会出现这种情况。我阅读了很多论坛,在同样的方法中,其他人似乎比我更成功。
我目前的流程是使用Kinect Matlab(使用Openni)来捕获数据,使用Kinect SDK进行重建,然后使用Kinect SDK进行对齐(通过NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution)。我怀疑这可能是由于Openni引起的,但我在创建使用Kinect SDK进行捕获的mex函数调用方面取得了很少成功。
如果有人能指点我应该深入研究的方向,那将不胜感激。
编辑:
我想发布一些代码。这是我用于对齐的代码:
请不要太仔细地观察模型:(。
可以看到,对齐是不正确的。我不确定为什么会出现这种情况。我阅读了很多论坛,在同样的方法中,其他人似乎比我更成功。
我目前的流程是使用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 ];
}
}