Ambos vídeos explican lo mismo con pequeños detalles de diferencia. Se explica el concepto de CONTORNO y su aplicación en visión artificial para análisis de formas, detección y reconocimiento de objetos. Se indica así mismo que para realizar este proceso debemos utilizar imágenes binarizadas y OpenCV obtendrá los contornos a partir de estos límites entre blancos y negros.
Los métodos que OpenCV establece para estas operaciones son cv2.findContours( ) y cv.drawContours( ).
El primer método nos puede devolver tres variables, y necesita tres argumentos, quedaría:
imagen, contornos, jerarquía = cv2.findContours(arg1, arg2, arg3)
La primera variable imagen se omite a partir de la versión OpenCV 4.x. Como tengo instalada OpenCV 4.6 no la uso, pero muestro la información por si se ve en algún programa que use versiones antiguas de OpenCV.
La segunda variable contornos, que almacenaría los contornos de las figuras mediante una lista de las coordenadas (x, y) de cada pixel del contorno.
La tercera variable jerarquía (también puede ser omitida) crearía un array de los contornos en referencia a su posición respecto de la imagen. Si tenemos un contorno dentro de otro como muestra la imagen inferior en los casos del cuadrado y del triángulo, tendríamos que los contornos exteriores serian 'padres' y lo interiores serían 'hijos'. Estarían pues jerarquizados.
arg1 --> La imagen de origen.
arg2 --> El modo de recuperación del contorno.
cv2.RETR_EXTERNAL
cv2.RETR_LIST
cv2.CCOMP
cv2.RETR_TREE
arg3 --> Es el método de aproximación del contorno
cv2.CHAIN_APPROX_NONE (Almacena todos los puntos límite)
cv2.CHAIN_APPROX_SIMPLE (Elimina los puntos redundante y comprime el contorno)
En el caso que nos ocupar utilizaremos:
contornos, jerarquia = cv2.findContours(imagen, cv2RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
El método para dibujar los contornos será:
cv2.drawContours(arg1, arg2, arg3, arg4, arg5)
arg1 --> Será la imagen
arg2 --> variable que contiene los contornos
arg3 --> Posición del contorno a dibujar. Si pasamos -1 se dibujan todos ellos.
arg4 --> Pasamos el color BGR, ejemplo 0, 255, 0 (Verde)
arg5 --> Grosor en píxeles de la línea.
Primera aproximación al programa:
Se puede observar que el color amarillo del triángulo no pasa el umbral establecido y por tanto se desecha. Ahora modificamos el programa para que se impriman los contornos en consola y poder visualizar esos datos
El área de contorno viene dada por la función:
arg1 --> Contorno
area = cv2.contourArea(contorno)
También se le llama longitud de arco. Se puede averiguar usando la función:
cv2.arcLength(arg1, arg2) .
arg1--> Contorno
arg2 --> El segundo argumento especifica si la forma es un contorno cerrado para lo cual debemos pasar True, o simplemente una curva.
perimetro = cv.arcLength (cnt, True )