9-Mar-2021
Para calcular la matriz H se hace con la función findHomography() que recibe dos vectores de puntos, los de origen y los de destino.
Los de origen serán los vértices detectados con getVerticesMascara y los de destino serán los vertices de una masara vista desde planta.
Luego se aplica la matriz a cada uno de los puntos de la imagen con la función perspectiveTransform() que convierte las coordenadas de un punto en las de su punto homologo en el plano al que lleva la matriz de homografía. Es decir las coordenadas de un punto en el plano con perspectiva se traducen a las coordenadas del plano de vista en planta.
En función del punto de origen, su posición (x,y) en el plano en planta puede ser muy grande.
He probado varias cosas, (1) aplicar a toda la imagen original la matriz H, y veo cuales deberían ser las dimensiones del canvas de vista en planta para acoger a todos los puntos. Son demasiado grandes. (2) la siguiente prueba fue cropear la imagen del cuadrado para aplicar sólo a ésta y también se va de madre.
Voy a intentar colocar el cuadrado en planta con su centro en la posición del centro del que esta en perspectiva en una imagen dos veces el tamaño de la imagen original. Calculo la matriz H con los vertices del cuadrado en planta como destino y aplico a toda la imagen.
A ver si así consigo aplicar correctamente la traslación a plano en planta.
7-Mar-2021
Para encontrar las esquinas del polígono que representa a la máscara, vamos a utilizar el algoritmo descrito en “Buscar el centro de un Contorno con OpenCV Python” (pero en C++) que encuentra el centro del contorno.
Una vez encontrado el centro buscamos las cuatro esquinas, buscando los puntos con menor y mayor x,y.
Pero esto no garantiza que sea la esquina real, hay que ajustar. Puede pasar que haya varios puntos con la menor y.
Se ha creado la función getVerticesMascara que obtiene los vértices ajustados de la máscara, teniendo en cuenta el problema anterior en cada vértice.
Se ha observado que drawContours no pinta exactamente los puntos de un contorno, mucho menos si rellena la máscara. Esto se ha comparado con la salida de una función que he creado, función myDrawContours, que pinta pixel a pixel en la matriz de salida los puntos del contorno.
Se ha creado, con los vertices extraidos y ajustados por getVerticesMascara, un polígono y se dibuja sobre la salida de myDrawContours. Se ajusta casi perfecto a los puntos pintados pixel a pixel en la matriz de salida.
Se rellena el polígono generado en el paso anterior, utilizando floodFill comenzando desde el centro de la mascara. La razón de rellenar el polígono y no la salida de myDrawContours es porque el contorno obtenido con findContours no tiene los borde completamente limpios, tiene pixels (ruido) pegados a las líneas que no definen un contorno con aristas rectas completamente.
Finalmente tenemos una máscara (cuadrado de control) limpio y relleno. Salida png en el fichero 07_FASE1_MASCARA_ESQUINAS_POLY.png
6-Mar-2021
Se ha creado una rama nueva en el proyecto, llamada SinExtensionReferencia (no ampliar la mascara para poder aplicar homografía)
Se ha corregido un error que hacía que salieran demasiados contornos. Además se ha entendido cómo funciona bien findContours en relación a contours y hierarchy.
El error era que el contorno detectado de la no era cerrado por un pixel. Se ha resuelto con erode(dilate()) del borde obtenido con canny previo al findcontours. Hay que probar con nuevas imagenes y garantizar que se segmenta correctamente la imagen en diversas condiciones de imagen, suelo, etc…
Ahora los contornos son cerrados y salen los justos. Se generan imagenes de máscara para piel y mascara..
Se han troceado y creado varias funciones mucho más simples para la detección de contornos.
- Hay que detectar las esquinas y conseguir la matriz de homografía.
- Intentar aplicar la matriz de transformación a toda la imagen pero sin escalar los puntos, sino con los mismos puntos que detectamos de las esquinas del cuadrado. Creo que en este StackOverlow explican cómo poder hacerlo.
4-Mar-2021
Analizando el código de Manuel
Se han cambiado algunos nombres de variables y añadidos de comentarios. No se cambia código en esta tarea, porque es sólo para analizar lo hecho.
- Función inicializaImagen() : Se debería hacer un smooth de la imagen antes de obtener los bordes, y antes de pasarla a blanco y negro.
- La función cambioPerspectiva debería trocearse en varias funciones.
- Intentar aplicar la matriz de transformación a toda la imagen pero sin escalar los puntos, sino con los mismos puntos que detectamos de las esquinas del cuadrado. Creo que en este StackOverlow explican cómo poder hacerlo.
Voy a crear una nueva rama para el proyecto y hacer estos cambios, y ver si soy capaz de aplicar el tercer punto.
3-Mar-2021
Se ha creado el repositorio BitBucket para el proyecto, con un primer código con la versión de Manuel, al que se han adaptado los paths y variables del proyecto para includes y libs. Se ha instalado OpenCV.
Se pretende: