¿Por qué el color y la profundidad de kinect no se alinean correctamente?

He estado trabajando en este problema durante bastante tiempo y estoy al final de mi creatividad, así que espero que alguien más pueda ayudarme a orientarme en la dirección correcta. He estado trabajando con Kinect e intentando capturar datos en MATLAB. Afortunadamente hay bastantes formas de hacerlo (actualmente estoy usandohttp://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Cuando intenté proyectar los datos capturados en 3D, mis métodos tradicionales dieron malos resultados de reconstrucción.

Para abreviar una larga historia, terminé escribiendo un contenedor de Kinect SDK para matlab que realiza la reconstrucción y la alineación. La reconstrucción funciona como un sueño, pero ...

Estoy teniendo muchos problemas con la alineación, como pueden ver aquí:

Por favor, no mire demasiado de cerca el modelo :(.

Como puedes ver, la alineación es incorrecta. No estoy seguro de por qué ese es el caso. He leído muchos foros donde otros han tenido más éxito que yo con los mismos métodos.

Mi canal actual está usando Kinect Matlab (usando Openni) para capturar datos, reconstruir usando el Kinect SDK, luego alinear usando el Kinect SDK (por NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution). Sospeché que tal vez se debió a Openni, pero he tenido poco éxito en la creación de llamadas a la función mex para capturar usando el Kinect SDK.

Si alguien me puede orientar en una dirección en la que debería profundizar más, sería muy apreciado.

Editar:

Figura que debería publicar algún código. Este es el código que uso para la alineación:

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

            }

    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta