Сшивание нескольких текстур / фреймов в OpenGL с помощью Kinect - PullRequest
0 голосов
/ 13 февраля 2012

Мне попалась следующая ситуация:

  1. У меня есть камера Kinect, и я продолжаю снимать кадры (но они сохраняются только тогда, когда пользователь нажимает клавишу).
  2. Я использую библиотеку freenect для получения глубины и цвета рамки (меня не интересует отслеживание скелета или что-то в этом роде).
  3. Для одного кадра я использую пример glpclview, который поставляется с библиотекой freenect

После получения данных о пространстве от датчика Kinect, в примере glpclview текущий кадр отображается следующим образом:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_SHORT, 0, xyz);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_SHORT, 0, xyz);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, gl_rgb_tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb);

glPointSize(2.0f);
glDrawElements(GL_POINTS, 640*480, GL_UNSIGNED_INT, indices);

, где

static unsigned int indices[480][640];
static short xyz[480][640][3];
char *rgb = 0;
short *depth = 0;

где:

  • rgb - информация о цвете для текущего кадра
  • глубина - информация о глубине для текущего кадра
  • xyz построен как:

    xyz [i] [j] [0] = j xyz [i] [j] 3 = i xyz [i] [j] 4 = глубина [i * 640 + j]

  • индексы - это (я думаю, только) массив, который отслеживает данные rgb / глубины и построен как:

    индексы [i] [j] = i * 640 + j

Пока все хорошо, но теперь мне нужно визуализировать больше, чем один кадр (некоторые из них поворачиваются и перемещаются с определенным углом / смещением). Как я могу это сделать? Я пытался увеличить размер массивов и сохранить перераспределение памяти для каждого нового кадра, но как я могу их отрендерить? Должен ли я изменить эту текущую строку на что-то еще?

glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb)

Если это так, на какие значения я должен изменить 640 и 480, так как теперь xyz и rgb - это указатель непрерывности 640x480x (количество кадров)?

Чтобы лучше понять, я пытаюсь получить что-то похожее на это в конце (кроме робота: D).

Если у кого-то есть лучшая идея, подскажите что-нибудь о том, как мне следует подойти к этой проблеме, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 13 февраля 2012

Это не так просто, как выделение большего массива.

Если вы хотите соединить несколько облаков точек, чтобы сделать карту большего размера, вы должны изучить алгоритмы SLAM (вот чем они являются.запустив в ролике вашу ссылку).Вы можете найти множество реализаций на http://openslam.org. Вы также можете изучить алгоритм ICP (итеративная ближайшая точка) и KinectFusion от Microsoft (и реализацию KinFu с открытым исходным кодом от PCL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...