Warum werden Farbe und Tiefe von Kinect nicht richtig ausgerichtet?

Ich habe lange an diesem Problem gearbeitet und bin am Ende meiner Kreativität angelangt. Hoffentlich kann mir jemand anderes dabei helfen, mich in die richtige Richtung zu lenken. Ich habe mit dem Kinect gearbeitet und versucht, Daten in MATLAB zu erfassen. Glücklicherweise gibt es einige Möglichkeiten, dies zu tun (ich verwende derzeithttp://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Als ich versuchte, die erfassten Daten in 3D zu projizieren, lieferten meine traditionellen Methoden schlechte Rekonstruktionsergebnisse.

Um es kurz zu machen, ich habe einen Kinect SDK-Wrapper für matlab geschrieben, der die Rekonstruktion und Ausrichtung durchführt. Der Wiederaufbau funktioniert wie ein Traum, aber ...

Ich habe viele Probleme mit der Ausrichtung, wie Sie hier sehen können:

Bitte schauen Sie sich das Modell nicht zu genau an :(.

Wie Sie sehen, ist die Ausrichtung falsch. Ich bin mir nicht sicher, warum das so ist. Ich habe viele Foren gelesen, in denen andere erfolgreicher waren als ich mit den gleichen Methoden.

Meine aktuelle Pipeline verwendet Kinect Matlab (mit Openni) zum Erfassen von Daten, zum Rekonstruieren mit dem Kinect SDK und zum Ausrichten mit dem Kinect SDK (von NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution). Ich vermutete, dass es vielleicht an Openni lag, aber ich hatte wenig Erfolg damit, mex-Funktionsaufrufe für die Erfassung mit dem Kinect SDK zu erstellen.

Wenn jemand mich in eine Richtung lenken kann, in die ich mich vertiefen sollte, wäre er sehr dankbar.

Bearbeiten:

Abbildung Ich sollte einen Code posten. Dies ist der Code, den ich für die Ausrichtung verwende:

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

            }

    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage