Почему 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 ];

            }

    }

Ответы на вопрос(3)

Ваш ответ на вопрос