2012-01-27 10 views
9

Tengo una malla de, por ejemplo, 11 x 11 vértices. La idea es que cada punto (vértice) mantenga la posición de coma flotante normalizada de ese píxel en la imagen deformada. P.ej. si quiero estirar el borde superior izquierdo, escribo en el primer vértice (-0.1, -0.1).¿Cómo uso cv :: remap con malla de reenvío, no de reverso, para deformar las imágenes?

Tengo la cuadrícula, pero no la función de deformación de la imagen. cv::remap hace exactamente eso ... pero en el orden inverso - la malla "dice" qué vecindario de píxel debe asignarse a una cuadrícula regular en la salida.

¿Existe una forma estándar en OpenCV para manejar el alabeo inverso? ¿Puedo transformar fácilmente la malla o usar otra función? Estoy usando OpenCV y Boost, pero cualquier biblioteca/herramienta gratuita que funcione me funcionará.

PD: Necesito esto ejecutándose en una PC Linux.

+0

He resuelto mi problema. El problema era realmente urgente, así que empujé a la gente por la oficina, hasta que se encontró una solución (una patentada, por desgracia). Sin embargo, todavía estoy muy perplejo por qué un problema así (deformación de la imagen a través de una rejilla) no se ha resuelto de una manera abierta, gratuita y accesible. – Vorac

+0

¿Podría darnos algunos detalles sobre cómo resolvió el problema? – Marcin

+0

@Marcin, desafortunadamente el tipo EGL escribió un mapeador inverso para el dispositivo en tal vez una semana (eso es lo que quise decir con 'solución patentada'). Todavía me desconcierta por qué dicha funcionalidad no está incluida en OpenCV. Quizás algún día alguien resuelva el problema y publique una referencia a la solicitud de extracción aquí como respuesta. Quizás yo, hmmmmm, o tú. – Vorac

Respuesta

1

Necesita calcular otros mapas para la transformación inversa.

Pero, para eso necesita la fórmula de transformación o matriz.

Paso 1: Seleccione 4 puntos en la imagen reasignada. Una buena idea sería tomar las curvas, si las esquinas no son negro (sin definir)

Paso 2: encontrar su lugar en la imagen original (ver en los mapas para eso)

Paso 3 : Calcule la homografía entre los dos conjuntos de puntos. findHomoraphy() es la clave.

Paso 4: warpPerspectivamente la segunda imagen. Internamente, calcula las cuadrículas, luego llama a remap();

Si tiene la misma transformación que antes, invierta los puntos de entrada con puntos de salida en findHomography, o inv() en la matriz resultante.

Si desea tener los mapas para varias llamadas (es más rápido que llamar a warpPerspective cada vez), debe copiar el código de warpPerspective en una nueva función.

+0

Hola, vasile y gracias por la respuesta. Creo que no es lo que estoy buscando, ya que reduce los grados de libertad. Explicaré: la malla es arbitraria y no hay líneas rectas restrictivas en la imagen original para proyectar en líneas rectas en el resultado. – Vorac

+0

Hmmm, mi solución solo funciona para las transformaciones que se describen por una relación geométrica: una transformación 3D.Si su malla describe una distorsión de lente ojo de pez, o algo así, la única solución es escribir una función que tome la malla de entrada y cree la salida uno como una función inversa. – Sam

+0

Sí, incluso más general: las posiciones de los nodos de malla son bastante arbitrarias. Resulta una función alternativa a la de Opencv, pero que acepta Warp de mapeo directo se implementa "fácilmente" en OpenGL: "solo" sobre el trabajo de una semana. Otra solución propuesta fue escribir una función tal que mencionas: alguna interpolación bilineal en la cuadrícula de salida (no rectangular) para encontrar las coordenadas de la cuadrícula de entrada correspondientes. – Vorac

Cuestiones relacionadas