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 ];

            }

    }

questionAnswers(3)

yourAnswerToTheQuestion