Почему kinect цвет и глубина не выровнены правильно?
Я работаю над этой проблемой уже довольно давно и нахожусь в конце своего творчества, так что, надеюсь, кто-то еще может помочь мне указать верное направление. Я работал с Kinect и пытался записать данные в MATLAB. К счастью, есть несколько способов сделать это (в настоящее время я используюhttp://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Когда я попытался спроецировать полученные данные в 3D, мои традиционные методы дали плохие результаты реконструкции.
Короче говоря, в итоге я написал оболочку Kinect SDK для matlab, которая выполняет реконструкцию и выравнивание. Реконструкция работает как мечта, но ...
У меня тонны проблем с выравниванием, как вы можете видеть здесь:
Пожалуйста, не смотрите внимательно на модель :(.
Как видите, выравнивание неверное. Я не уверен, почему это так. Я прочитал много форумов, где другие добились большего успеха, чем я, используя те же методы.
Мой текущий конвейер использует Kinect Matlab (используя Openni) для захвата данных, реконструируя с использованием Kinect SDK, а затем выравнивая, используя Kinect SDK (NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution). Я подозревал, что это возможно из-за Openni, но у меня был небольшой успех в создании вызовов функций mex для захвата с использованием Kinect SDK.
Если кто-то может указать мне направление, в которое я должен углубиться, это будет очень цениться.
Редактировать:
Рисунок, я должен опубликовать некоторый код. Это код, который я использую для выравнивания:
/* 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 ];
}
}