Как преобразовать точки в пространстве глубины в цветовое пространство в 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-точки с исходной цветовой камерой. Кто-нибудь знает, как идти о вычислении этой матрицы преобразования? Где я могу найти больше информации об этом?

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …