В настоящее время я использую программное обеспечение 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
Я могу загрузить больше вещей, если это необходимо, просто дайте мне знать, что вы, ребята, должны мне помочь:)