Подтвердить что ты не робот

Отображение проекций с помощью Kinect и OpenGL

В настоящее время я использую программное обеспечение JavaCV procamcalib для калибровки установки Kinect-Projector, в которой есть Kinect RGB Camera как источник. Эта настройка состоит исключительно из камеры Kinect RGB (Im, грубо использующей Kinect, как обычную камеру в данный момент) и одного проектора. Это программное обеспечение для калибровки использует LibFreenect (OpenKinect) в качестве драйвера Kinect.

Как только программа завершит свой процесс, он предоставит мне параметры внутренней и внешней характеристики как камеры, так и проектора, которые выбрасываются с помощью программного обеспечения OpenGL для проверки калибровки и где начинается несколько проблем. Когда проекция и представление модели правильно установлены, я должен учесть то, что видит Kinect, с тем, что проецируется, но для этого я должен выполнить ручной перевод на всех трех осях, и эта последняя часть не делает любой смысл для меня! Не могли бы вы, ребята, помочь мне разобраться с этим? SDK, используемый для извлечения данных Kinect, OpenNI (не последняя версия 2.x, она должна быть 1.5.x)

Я точно объясню, что Im делает, чтобы воспроизвести эту ошибку. Параметры калибровки используются следующим образом:

Матрица проекции задается как (на основе http://sightations.wordpress.com/2010/08/03/simulating-calibrated-cameras-in-opengl/):

r = width/2.0f;         l = -width/2.0f;
t = height/2.0f;        b = -height/2.0f;

alpha = fx;      beta = fy;
xo    = cx;      yo   = cy;

X = kinectCalibration.c_near + kinectCalibration.c_far;
Y = kinectCalibration.c_near*kinectCalibration.c_far;

d = kinectCalibration.c_near - kinectCalibration.c_far;


float* glOrthoMatrix = (float*)malloc(16*sizeof(float));

glOrthoMatrix[0] = 2/(r-l); glOrthoMatrix[4] = 0.0f;        glOrthoMatrix[8] = 0.0f;        glOrthoMatrix[12] = (r+l)/(l-r);
glOrthoMatrix[1] = 0.0f;    glOrthoMatrix[5] = 2/(t-b);     glOrthoMatrix[9] = 0.0f;        glOrthoMatrix[13] = (t+b)/(b-t);
glOrthoMatrix[2] = 0.0f;    glOrthoMatrix[6] = 0.0f;        glOrthoMatrix[10] = 2/d;        glOrthoMatrix[14] = X/d;
glOrthoMatrix[3] = 0.0f;    glOrthoMatrix[7] = 0.0f;        glOrthoMatrix[11] = 0.0f;       glOrthoMatrix[15] = 1;
printM( glOrthoMatrix, 4, 4, true, "glOrthoMatrix" );


float* glCameraMatrix = (float*)malloc(16*sizeof(float));

glCameraMatrix[0] = alpha;  glCameraMatrix[4] = skew;   glCameraMatrix[8] = -xo;    glCameraMatrix[12] = 0.0f;
glCameraMatrix[1] = 0.0f;   glCameraMatrix[5] = beta;   glCameraMatrix[9] = -yo;    glCameraMatrix[13] = 0.0f;
glCameraMatrix[2] = 0.0f;   glCameraMatrix[6] = 0.0f;   glCameraMatrix[10] = X;     glCameraMatrix[14] = Y;
glCameraMatrix[3] = 0.0f;   glCameraMatrix[7] = 0.0f;   glCameraMatrix[11] = -1;    glCameraMatrix[15] = 0.0f;

float* glProjectionMatrix = algMult( glOrthoMatrix, glCameraMatrix );

И матрица Modelview задается как:

proj_loc = new Vec3f(   proj_RT[12], proj_RT[13], proj_RT[14] );    
proj_fwd = new Vec3f(   proj_RT[8],  proj_RT[9],  proj_RT[10] );
proj_up  = new Vec3f(   proj_RT[4],  proj_RT[5],  proj_RT[6]  );
proj_trg = new Vec3f(   proj_RT[12] + proj_RT[8], 
                        proj_RT[13] + proj_RT[9], 
                        proj_RT[14] + proj_RT[10] );

gluLookAt( proj_loc[0], proj_loc[1], proj_loc[2],
           proj_trg[0], proj_trg[1], proj_trg[2],
           proj_up[0],  proj_up[1],  proj_up[2] );

И наконец, камера отображается и перемещается с помощью:

glPushMatrix();
glTranslatef(translateX, translateY, translateZ); 
drawRGBCamera();
glPopMatrix();

где значения трансляции настраиваются вручную с клавиатуры до тех пор, пока у меня не будет визуального соответствия (я проецирую на калибровочную панель, что видит камера Kinect-rgb, поэтому я вручную настраиваю камеру opengl до тех пор, пока проецируемый шаблон не будет соответствовать напечатанный рисунок).

Мой вопрос здесь: ПОЧЕМУ я должен выполнить эту настройку вручную? Эта модель должна заботиться о моделировании и настройке проекции.

Я также блуждал, если есть какие-то проблемы при переключении таких драйверов, поскольку OpenKinect используется для калибровки и OpenNI для проверки. Это пришло в голову при исследовании другого популярного калибровочного инструмента RGBDemo, в котором говорится, что при использовании базы данных LibFreenect необходима калибровка Kinect.

Итак, будет ли неправильная калибровка сделана с драйвером и отображена другим?

Кто-нибудь подумает, что добиться успеха будет проще, если это будет сделано с OpenCV, а не с OpenGL?

Справочник JavaCV: https://code.google.com/p/javacv/
Procamcalib "короткая бумага": http://www.ok.ctrl.titech.ac.jp/~saudet/research/procamcalib/
Исходный код Procamcalib: https://code.google.com/p/javacv/source/browse?repo=procamcalib
Калибровка RGBDemo Reference: http://labs.manctl.com/rgbdemo/index.php/Documentation/Calibration

Я могу загрузить больше вещей, если это необходимо, просто дайте мне знать, что вы, ребята, должны мне помочь:)

4b9b3361

Ответ 1

Я автор статьи, с которой вы связались, и я думаю, что смогу помочь.

Проблема заключается в том, как вы устанавливаете свою модельную матрицу. Вы используете третий столбец proj_RT в качестве положения камеры, когда вы вызываете gluLookAt(), но это не позиция камеры, это положение мирового происхождения в координатах камеры. Я написал статью для своего нового блога, который может помочь прояснить это. Он описывает три разных (эквивалентных) способа интерпретации внешней матрицы с демонстрациями WebGL каждого из них:

http://ksimek.github.io/2012/08/22/extrinsic/

Если вы должны использовать gluLookAt, эта статья покажет вам, как это сделать, но гораздо проще просто вызвать glLoadMatrix(proj_RT).

tl; dr: замените gluLookAt() на glLoadMatrix(proj_RT)

Ответ 2

Для калибровки Kinect ознакомьтесь с последней версией RGBDemo версии http://labs.manctl.com/rgbdemo и соответствующей Источник калибровки Freenect.

Из v0.7.0 ChangeLogs:

Новые функции, начиная с v0.6.1:

  • Новое демо для приобретения объектных моделей с использованием маркеров
  • Простой режим калибровки для rgbd-multikinect
  • Гораздо более быстрый захват в rgbd-multikinect
  • Добавление временных меток и серий сериалов при сохранении на диск
  • Совместимость с PCL 1.4 Различные исправления ошибок.

Очень хорошая книга для подражания - Джейсон МакКессон Изучение современного 3D-графического программирования Вы также можете прочитать Страница Kinect ROS и Николя Страница калибровки Kinect