Extracto de homografía proyectiva de dos mapas de profundidad de Kinect
Dado dos nubes de puntos 3D consecutivas 1 y 2 (no toda la nube, digamos 100 puntos seleccionados de la nube con GoodFeaturesToMatch de OpenCV), obtenidos de un mapa de profundidad de Kinect, quiero calcular la homografía de la cámara del 1 al 2. Entiendo que esto es un transformación proyectiva, y ya lo han hecho muchas personas: aquí (diapositiva 12), aquí (diapositiva 30) yaquí en lo que parece ser el clásico papel. Mi problema es que, si bien soy un programador competente, no tengo las habilidades matemáticas o trigonométricas para convertir uno de esos métodos en código. Como este no es un problema fácil, ofrezco una gran recompensa por el código que resuelve el siguiente problema:
La cámara está en el origen, mirando en la dirección Z, en pentaedro irregular [A, B, C, D, E, F]:
a cámara se mueve -90 mm hacia la izquierda (X), + 60 mm hacia arriba (Y), + 50 mm hacia adelante (Z) y gira 5 ° hacia abajo, 10 ° hacia la derecha y -3 ° en sentido antihorario:
Rotar toda la escena para que la cámara vuelva a su posición original me permite determinar la ubicación de los vértices en 2:
Los archivos 3DS Max utilizados para preparar esto sonmax 1, max 2 ymax 3
Aquí están las posiciones de los vértices antes y después, los intrínsecos, etc.:
enga en cuenta que los vértices de camera2 no son 100% precisos, hay un poco de ruido deliberado.
aquí están los números en un archivo de Excel
El código que necesito, que debe ser fácilmente traducible a VB.Net o C #, usando EMGUCV y OpenCV cuando sea necesario, toma los 2 conjuntos de vértices y los intrínsecos y produce esta salida:
Camera 2 is at -90 X, +60 Y, +50 Z rotated -5 Y, 10 X, -3 Z.
The homography matrix to translate points in A to B is:
a1, a2, a3
b1, b2, b3
c1, c2, c3
No sé si la homografía es 3X3 o 3X4 para coordenadas homogéneas, pero debe permitirme traducir los vértices de 1 a 2.
Tampoco conozco los valores a1, a2, etc. eso es lo que tienes que encontrar>; -)
La oferta de 500 recompensas 'reemplaza' la recompensa que ofrecí aesta pregunta muy similar, Agregué un comentario allí que apunta a esta pregunta.
EDIT2: Me pregunto si la forma en que hago esta pregunta es engañosa. Me parece que el problema es más el ajuste de la nube de puntos que la geometría de la cámara (si sabes cómo traducir y rotar de A a B, sabes la transformación de la cámara y viceversa). Si es así, entonces quizás la solución podría obtenerse con el algoritmo de Kabsch o algo similar