Wie konvertiert man in Kinect Punkte im Tiefenraum in einen Farbraum, ohne die Kinect SDK-Funktionen zu verwenden?

Ich mache eine Augmented Reality-Anwendung mit 3D-Objekten, die über dem Farbvideo des Benutzers liegen. Kinect Version 1.7 wird verwendet und das Rendern von virtuellen Objekten erfolgt in OpenGL. Ich habe es geschafft, 3D-Objekte auf Tiefenvideos erfolgreich zu überlagern, indem ich einfach die intrinsischen Konstanten für die Tiefenkamera aus dem NuiSensor.h-Header verwendet und eine Projektionsmatrix basierend auf der Formel berechnet habe, auf der ich gefunden habehttp://ksimek.github.io/2013/06/03/calibrated_cameras_in_opengl/. Die mit dieser Projektionsmatrix gerenderten 3D-Objekte überlagern genau die 2D-Skelettpunkte im Tiefenraum. Dies ist nicht überraschend, da 3D-Skelettpunkte aus dem Tiefenraum berechnet werden und ich mir sicher bin, dass die außerhalb von Kinect SDK berechnete Projektionsmatrix funktioniert.

Hier sind einige Codes zur Berechnung der Projektionsmatrix aus intrinsischen Konstanten und deren Verwendung:

glm::mat4 GetOpenGLProjectionMatrixFromCameraIntrinsics(float alpha, float beta, float skew, float u0, float v0, 
    int img_width, int img_height, float near_clip, float far_clip ) 
{
    float L = 0;
    float R = (float)img_width;
    float B = 0;
    float T = (float)img_height;
    float N = near_clip;
    float F = far_clip;

    glm::mat4 ortho = glm::mat4(0);
    glm::mat4  proj = glm::mat4(0);

    //Using column major convention 
    ortho[0][0] =  2.0f/(R-L); 
    ortho[0][3] = -(R+L)/(R-L);     
    ortho[1][1] =  2.0f/(T-B); 
    ortho[1][3] = -(T+B)/(T-B);     
    ortho[2][2] = -2.0f/(F-N); 
    ortho[2][3] = -(F+N)/(F-N); 
    ortho[3][3] = 1; 

    proj[0][0] = alpha;     proj[0][1] = skew;  proj[0][2] = -u0;
    proj[1][1] = beta;  proj[1][2] = -v0;
    proj[2][2] = (N+F); proj[2][3] = (N*F);
    proj[3][2] = -1;

    //since glm is row major, we left multiply the two matrices
    //and then transpose the result to pass it to opengl which needs
    //the matrix in column major format
    return glm::transpose(proj*ortho);   
}

//Compute projection matrix of Kinect camera    
    m_3DProjectionMatrix = GetOpenGLProjectionMatrixFromCameraIntrinsics(m_fx, m_fy, m_skew, m_PPx0, m_PPy0, WIN_WIDTH, WIN_HEIGHT, 0.01f, 10);

//where the input variables are 1142.52, 1142.52, 0.00, 640.00, 480.00, 1280, 960 respectively for m_fx, m_fy, m_skew, m_PPx0, m_PPy0, WIN_WIDTH, WIN_HEIGHT. These numbers are derived from NuiImageCamera.h for depth camera.

So werden die 2D-Punkte gezeichnet:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();   
glOrtho(0, WIN_WIDTH, WIN_HEIGHT, 0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

Draw2DSkeletonRGBPoints();//Uses NuiTransformSkeletonToDepthImage() followed by NuiImageGetColorPixelCoordinatesFromDepthPixel()
Draw2DSkeletonDepthPoints();//Uses NuiTransformSkeletonToDepthImage() only

Gefolgt von 3D-Punkten:

glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(m_3DProjectionMatrix));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

Draw3DSkeletonPoints();//The Skeleton 3D coordinates from Kinect

Das Überlagern von virtuellen Objekten über Farbvideos ist jedoch nicht sofort möglich. Es scheint, als gäbe es einige Verschiebungen, Skalierungen oder sogar leichte Rotationen zwischen Farbe und Tiefenraum. Ich weiß, dass es eine SDK-Funktion zum Konvertieren von Skelettpunkten in Farbpunkte gibt, aber dies kann nicht einfach für OpenGL-Rendering verwendet werden. Ich benötige eine Transformationsmatrix, die 3D-Skelettpunkte im Skelettkoordinatenraum in 3D-Punkte mit der Farbkamera als Ursprung abbildet. Weiß jemand, wie man diese Transformationsmatrix berechnet? Wo finde ich weitere Informationen dazu?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage