Ests aqu: Inicio/Blog/Vision Artificial/Detector de bordes Canny cmo contar objetos con OpenCV y Python
Si eres seguidor del blog y del podcast, sabrs que soy un apasionado de la Visin Artificial. En
Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos
este artculo voy a explicarte cmo puedes contar objetos en una imagen gracias al detector
que acepta su uso. Aceptar Poltica de privacidad y cookies
de bordes Canny con OpenCV y Python.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
de bordes Canny con OpenCV y Python.
La deteccin de bordes es una tcnica muy utilizada que nos permite aislar los objetos y
separarlos del fondo. Una vez obtenido los bordes, lo nico que nos faltara es detectar los
diferentes contornos para poder contar los objetos.
Poder contar tornillos, tuercas, monedas o cualquier otro objeto es relativamente sencillo gracias a
OpenCV. La Visin Artificial es un subcampo de las matemticas que abarca muchas tcnicas del
tratamiento digital de imgenes.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
No hay un algoritmo perfecto y siempre depender de las condiciones en las que se tom la
imagen. Hoy veremos un caso ideal, donde hay un fuerte contraste entre el fondo y los propios
objetos.
Utilidad? Pues imagnate que necesitas hacer una aplicacin que cuente el dinero, que cuente
tornillos o que cuente fruta. Un ejemplo lo ha llevado a cabo un alumno del Campus de
Programarfacil.
Ha creado un algoritmo capaz de contar el dinero que hay en un vdeo en tiempo real.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Indice de contenidos
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
En la imagen que vamos a analizar existe un fuerte contraste entre los objetos, las monedas, y el
fondo. Esto facilitar mucho a la hora de contar cuntas monedas hay.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Cada una de estas fases dar como resultado una imagen que ser la entrada de la siguiente
fase. Todo el proceso lo haremos con OpenCV y Python. Por lo tanto debers tener instalado
estas herramientas en tu ordenador.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Gua introduccin Visin Artificial
Aprende a dar los primeros pasos dentro de esta tecnologa
OpenCV + Anaconda
Nombre Email
DESCARGAR YA !!!
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Puedes seguir la gua para instalar OpenCV en Windows.
Por ejemplo, si tienes tres componentes de color como en el espacio RGB (R de Red, G de Green
y B de Blue) es como si estuvieras trabajando con 3 imgenes diferentes, una para cada
componente.
Ya no solo es eso, para aplicar el detector de bordes Canny necesitamos que la imagen est en
escala de grises. En OpenCV hay un mtodo que nos permite cambiar entre espacios de color.
Donde
Puedes ver todos los tipos de conversiones entre los diferentes espacios aqu.
Es algo que no solo sucede en los entornos visuales. Cualquier seal digital o analgica est
expuesta a diferentes fuentes de ruido. Debes vivir con ello y, sobre todo, debes saber cmo
corregirlo.
En el tratamiento digital de imgenes hay diferentes mtodos para eliminar el ruido (promediado,
mediana, Gaussiano o bilateral).
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Todos utilizan la misma operacin matemtica, la convolucin. Consiste en ir recorriendo pxel a
pxel una imagen con una mscara o kernel de N x N. Este tamao determina el nmero de pxeles
con el que vamos a trabajar.
Es muy importante que el tamao sea impar para siempre tener un pxel central que ser el
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
pxel en cuestin que estamos tratando.
El objetivo es suavizar la imagen es decir, eliminar los detalles. Puedes verlo como un desenfoque
en una cmara fotogrfica. Para poder contar los objetos o monedas vamos a aplicar el filtro
Gaussiano.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Pero por qu utilizar una Campana de Gauss? No es ms que una aproximacin de cmo ve
el ojo humano, intentando ser lo ms natural posible. La funcin Gaussiana o Distribucin Normal
se utiliza en muchas reas de la ciencia.
Para poder aplicarlo en una imagen debemos hacerlo en dos dimensiones. Esto lo hacemos a
travs de una mscara o kernel de convolucin.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Como puedes comprobar en la imagen anterior, se da ms importancia al pxel central que a los
pxeles que estn alrededor de ste.
Donde
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
gaussiana: es la imagen desenfocada resultante.
imagen: es la imagen original, la que queremos suavizar o desenfocar.
n X n: es el tamao del kernel o mscara de convolucin. Recuerda que debe ser impar.
: sigma () representa la desviacin estndar en el eje X es decir, la anchura de la
campana de Gauss. Si ponemos un 0, OpenCV se encargar automticamente de calcular
ese valor para el kernel o mscara que hemos elegido. Esta es la opcin aconsejable.
Esto dificulta mucho a la hora de buscar una solucin nica para diferentes situaciones y por lo
tanto, algo que funciona correctamente en unas condiciones de iluminacin no tiene porque
funcionar en otras circunstancias.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Normalmente, este tipo de algoritmos se entrenan para buscar la mejor solucin para mltiples
casos. A todo esto se le llama Machine Learning. Aunque esto se salga fuera del tema de este
artculo, debes ser consciente de la dificultad que todo esto supone.
Cuando hablamos de bordes en una imagen, hablamos de los pxeles donde hay un cambio de
intensidad. En imgenes como la que estamos utilizando para contar las monedas, hay un fuerte
contraste entre el fondo y las monedas.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
El objetivo es poder detectar este borde a travs de la primera derivada.
La supresin non-maximun es una tcnica que permite adelgazar los bordes basndose en el
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
gradiente.
En el detector de bordes Canny este es el ltimo paso. Al contrario que el umbral simple, el umbral
por histresis se centra en establecer dos umbrales, uno mximo y otro mnimo.
Esto te ayudar a determinar si un pxel forma parte de un borde o no. Pueden darse 3 casos:
Si el valor del pxel es mayor que el umbral mximo, el pxel se considera parte del borde.
Un pxel se considera que no es borde si su valor es menor que el umbral mnimo,
Si est entre el mximo y el mnimo, ser parte del borde si est conectado con un pxel que
forma ya parte del borde.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Esta librera nos aporta mtodos y funciones fciles de implementar. Si adems lo unimos a la
sencillez de hacerlo con un lenguaje como Python, las tcnicas de visin artificial y tratamiento de
imgenes estn al alcance de todo el mundo.
Donde:
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
curva de puntos sin huecos ni saltos es decir, tiene un principio y el final de la curva termina en
ese principio.
El objetivo de esta fase es analizar todos los bordes detectados y comprobar si son contornos o
no. En OpenCV lo podemos hacer con el siguiente mtodo.
Donde:
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Resultado: obtenemos 3 valores como resultados, el interesante para nosotros es contornos.
imagen: la imagen despus de aplicar la deteccin de contornos. Es modificada y por
lo tanto no podremos utilizarla.
contornos: es una lista de Python con todos los contornos que ha encontrado. Luego
veremos cmo dibujar estos contornos en una imagen.
jerarqua: la jerarqua de contornos.
imagenbinarizada: es la imagen donde hemos detectado los bordes o umbralizado. Mucho
ojo, este mtodo modifica esta imagen as que es conveniente que sea una copia. Como
norma general, la imagen binarizada debe ser con el fondo negro y los objetos a ser
buscados deben ser blancos.
modo_contorno: es un parmetro interno del algoritmo que indica el tipo de contorno que
queremos. Puede tomar diferentes valores RETR_EXTERNAL, RETR_LIST, RETR_COMP y
RETR_TREE. Nos centraremos en el primero, RETR_EXTERNAL que obtiene el contorno
externo de un objeto.
metodo_aproximacion: este parmetro indica cmo queremos aproximar el contorno.
Bsicamente le decimos si queremos almacenar todos los puntos del contorno. Imagnate
que tienes una lnea recta para qu quieres almacenar todos los puntos? con dos valdra. A
lo mejor ahora no le encuentras sentido pero cuando se analizan muchos objetos en
imgenes grandes, tendrs que llevar mucho cuidado con el tiempo de procesado y con la
memoria. Puede tomar dos valores CHAIN_APPROX_NONE que toma todos los puntos y
CHAIN_APPROX_SIMPLE, que elimina todos los puntos redundantes.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Dibujar los contornos en una imagen con OpenCV
Por ltimo nos queda dibujar los contornos que hemos encontrado en la imagen. Esto lo haremos a
travs de otro mtodo de OpenCV.
Donde:
Y con esto ya tendramos el algoritmo completo. Ahora vamos a unir todas las piezas y ver cmo
quedara el cdigo completo.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Gua introduccin Visin Artificial
Aprende a dar los primeros pasos dentro de esta tecnologa
OpenCV + Anaconda
Nombre Email
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
DESCARGAR YA !!!
Lo primero es importar las libreras NumPy y OpenCV. Luego, cargamos la imagen monedas. Te la
dejo a continuacin para que puedas hacer las pruebas con ella.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
En mi caso he guardado el archivo detector-canny.py y he creado una carpeta en el mismo
directorio para guardar la imagen (imagenes/monedas.jpg).
Para detectar los bordes con Canny, tenemos que partir de una imagen en escala de grises. El
mtodo cv2.cvtColor convertir la imagen cargada en color a una imagen en escala de grises.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Luego aplicamos el suavizado Gaussiano para eliminar el ruido. El mtodo cv2.GaussianBlur()
admite 3 parmetros.
El primero es la imagen que queremos suavizar en nuestro caso la imagen en escala de grises.
El segundo parmetro es el kernel o mscara de convolucin. Recuerda que debe ser impar.
Comenzamos con un tamao de 5 x 5. Cuanto mayor sea el kernel mayor ser el suavizado y
menos detalles tendr la imagen.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Calcular el detector de bordes Canny con OpenCV
Una vez que ya has suavizado la imagen, ya puedes proceder a la eliminacin de los bordes con la
supresin non-maximun y aplicar el umbral por histresis.
Estos dos procesos se hacen a travs del mtodo cv2.Canny. Admite 3 parmetros.
El primero es la imagen donde queremos detectar los bordes. Esta imagen es la que ya hemos
suavizado en el paso anterior.
El segundo parmetro ser el umbral mnimo y el tercer parmetro ser el umbral mximo. Debes
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
buscar los ms adecuados para tu imagen aunque, como vers posteriormente, no importa que se
detecten ms bordes siempre y cuando no sean contornos es decir, curvas cerradas.
Un valor de 50 para el mnimo y 150 para el mximo puede ser un buen comienzo. Intenta subir el
mximo para eliminar esos bordes inecesarios.
Por ltimo, volvemos a mostrar la imagen con los bordes detectados. El resultado sera el
siguiente.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Dibujar y detectar contornos
Una vez que tenemos los bordes, hay que decidir cuales de ellos forman contornos y cuales no.
Con el mtodo cv2.findContours() se detectan los contornos. Solo detectaremos los externos
(cv2.RETR_EXTERNAL) y se har una aproximacin para eliminar los pxeles del contorno
redundantes (cv2.CHAIN_APPROX_SIMPLE).
Este mtodo nos devuelve una lista de contornos adems de dos variables que no vamos a utilizar,
la imagen y la jerarqua de bordes. Con solo saber su tamao, sabremos cuantas monedas ha
encontrado. Toda esta informacin la mostramos por consola.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Por ltimo, pintamos los contornos sobre la imagen original con el mtodo cv2.drawContours().
Mostramos el resultado y esperamos a que se pulse una tecla con el mtodo cv2.waitKey(0).
OpenCV + Anaconda
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Python + NumPy + CsiPy + Matplotlib
Nombre Email
DESCARGAR YA !!!
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Si ejecutas el cdigo anterior con la imagen de las monedas el resultado es el siguiente.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Por consola obtendrs el valor de 8 objetos detectados.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Una fase previa que se podra incorporar es hacer que el contraste entre los objetos y el fondo se
realce, pero eso lo dejo para otro tutorial. De momento, siempre que tengas un alto contraste entre
el objeto y el fondo funcionar.
El algoritmo de contar objetos con el detector de bordes Canny es un ejemplo de cmo aplicar
diferentes tcnicas de visin artificial para conseguir un objetivo. Si quieres conocer en
profundidad el tratamiento digital de imgenes, no dejes de visitar el curso del Campus,
Introduccin a la Visin Artificial con OpenCV y Python.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Lo sentimos, el navegador que ests usando no est soportado actualmente. Disqus soporta de manera activa los
siguientes navegadores:
Firefox
Chrome
Internet Explorer 11+
Safari
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
#116 Drones ms all de un vehculo no tripulado con Lot Amors
Dentro del abanico de posibilidades que nos brinda la tecnologa, encontramos los drones. Se trata de
dispositivos que hacen volar un robot. Esto da
[+ info...]
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
NodeMCU tutorial paso a paso desde cero
NodeMCU es la placa de desarrollo basada en el ESP8266 que nos hace la vida ms fcil a los que queremos
desarrollar dispositivos conectados. En este
[+ info...]
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
#114 Sigfox, Arduino MKRFOX1200 y un medidor de radiacin UV
Si hablamos de Arduino estamos hablando de la democratizacin del uso de los microcontroladores. Desde
que hace ms de un ao present el Arduino
[+ info...]
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com