Corrección trapezoidal utilizando puntos 3D de Kinect

15

Con XNA, estoy mostrando un rectángulo simple que se proyecta en el piso. El proyector se puede colocar en una posición arbitraria. Obviamente, el rectángulo proyectado se distorsiona de acuerdo con la posición y el ángulo de los proyectores. Un Kinect escanea el piso buscando las cuatro esquinas. Ahora mi objetivo es transformar el rectángulo original de modo que la proyección ya no se distorsione básicamente al preformar el rectángulo.

Mi primer enfoque fue hacer todo en 2D: Primero calcule una transformación de perspectiva (usando OpenCV warpPerspective()) desde los puntos escaneados a los puntos del rectángulo interno y aplique el inverso al rectángulo. Esto parecía funcionar, pero era demasiado lento, ya que no se podía procesar en la GPU.

El segundo enfoque fue hacer todo en 3D para usar las funciones de renderizado de XNA. Primero, mostraría un plano, escanearía sus esquinas con Kinect y mapearía los puntos 3D recibidos en el plano original. Teóricamente, podría aplicar el inverso de la transformación de perspectiva al plano, como lo hice en el enfoque 2D. Sin embargo, dado que XNA funciona con una matriz de vista y proyección, no puedo simplemente llamar a una función como warpPerspective()y obtener el resultado deseado. Necesitaría calcular los nuevos parámetros para la vista de la cámara y la matriz de proyección.

Pregunta: ¿Es posible calcular estos parámetros y dividirlos en dos matrices (vista y proyección)? Si no, ¿hay otro enfoque que pueda usar?

philllies
fuente
1
XNA usa una vista y una matriz de proyección, pero creo que el resultado final = vector * vista * proyección. ¿Por qué no tratar de hacer ver una matriz de identidad y proyección la matriz de perspectiva inversa y ver si eso funciona? (No estoy 100% seguro de que esto sea exactamente lo que sucede)
Roy T.
1
¿Cómo exactamente calculó una transformación de perspectiva warpPespective? No estoy familiarizado con OpenCV, pero al leer el documento parece que esta función solo aplica una perspectiva a una imagen. ¿O estoy confundido? De todos modos, tal vez agregar más detalles sobre su primera implementación ayudaría.
Laurent Couvidou
Es posible que desee echar un vistazo a la biblioteca PCL ( pointclouds.org ). La conversión de la imagen de profundidad del kinect le proporciona una nube de puntos con la cámara en el origen, apuntando a lo largo del eje z. Entonces podría usar ransac u otro algoritmo para buscar el avión.
Exilyth

Respuestas:

1

Dado que el álgebra vectorial es compatible con GPU, se pueden usar normalizaciones y productos de puntos para encontrar las cuatro esquinas del plano original de la siguiente manera:

ingrese la descripción de la imagen aquí

Dado el punto del proyector (P), el punto proyectado (B), un punto arbitrario en el plano que contiene el rectángulo distorsionado (Q) y el vector normal a ese plano (n), el punto de intersección (A) del línea de P a B, y el plano viene dado por

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

Fuente http://geomalgorithms.com/a05-_intersect-1.html sección Intersección línea-plano

rraallvv
fuente