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

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