Как преобразовать точки в пространстве глубины в цветовое пространство в Kinect без использования функций Kinect SDK?

Я делаю приложение дополненной реальности с наложением трехмерных объектов поверх цветного видео пользователя. Используется Kinect версии 1.7, а рендеринг виртуальных объектов выполняется в OpenGL. Мне удалось успешно наложить трехмерные объекты на видео глубины, просто используя внутренние константы для камеры глубины из заголовка NuiSensor.h, и вычислить матрицу проекции на основе формулы, которую я нашел наhttp://ksimek.github.io/2013/06/03/calibrated_cameras_in_opengl/, Трехмерные объекты, визуализированные с помощью этой проекционной матрицы, накладываются точно на 2D каркасные точки в пространстве глубины. Это неудивительно, так как скелетные 3D-точки вычисляются из глубины и дают мне уверенность в том, что матрица проекций, рассчитанная вне Kinect SDK, работает.

Вот некоторые коды для вычисления проекционной матрицы по внутренним константам и как она используется:

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.

Вот как нарисованы 2D точки:

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

Далее следуют 3D очки:

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

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

Однако наложение виртуальных объектов поверх цветного видео не так уж и сразу. Кажется, есть некоторый перевод, масштабирование или даже небольшое вращение между цветом и пространством глубины. Я знаю, что есть функция SDK для преобразования скелетной точки в цветовую точку, но ее нельзя легко использовать для рендеринга OpenGL; Мне нужна матрица преобразования, которая отображает 3D-точки скелета в пространстве координат Skeleton в 3D-точки с исходной цветовой камерой. Кто-нибудь знает, как идти о вычислении этой матрицы преобразования? Где я могу найти больше информации об этом?

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

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