Por que a cor e a profundidade do kinect não se alinham corretamente?
Eu tenho trabalhado neste problema por algum tempo e estou no final da minha criatividade, então espero que alguém possa me ajudar a me apontar na direção certa. Eu tenho trabalhado com o Kinect e tentando capturar dados para o MATLAB. Felizmente há algumas maneiras de fazê-lo (estou usando atualmentehttp://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Quando tentei projetar os dados capturados para 3D, meus métodos tradicionais deram resultados ruins de reconstrução.
Para encurtar a história, acabei escrevendo um wrapper do Kinect SDK para o matlab que executa a reconstrução e o alinhamento. A reconstrução funciona como um sonho, mas ...
Estou tendo muitos problemas com o alinhamento, como você pode ver aqui:
Por favor, não olhe muito de perto para o modelo :(.
Como você pode ver, o alinhamento está incorreto. Eu não tenho certeza porque esse é o caso. Eu li muitos fóruns onde outros tiveram mais sucesso do que eu com os mesmos métodos.
Meu pipeline atual está usando o Kinect Matlab (usando Openni) para capturar dados, reconstruir usando o Kinect SDK e, em seguida, alinhar usando o Kinect SDK (por NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution). Eu suspeitava que talvez fosse devido a Openni, mas eu tive pouco sucesso na criação de chamadas de função mex para capturar usando o Kinect SDK.
Se alguém puder me apontar em uma direção que eu deveria aprofundar, seria muito apreciado.
Editar:
Figura eu deveria postar algum código. Este é o código que eu uso para alinhamento:
/* 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 ];
}
}