Anda di halaman 1dari 41

Buscar en este sitio

ARDUINO T IENDA PODCAST QUIN SOY? CONT ACT AR


Ests aqu: Inicio/Blog/Vision Artificial/Detector de bordes Canny cmo contar objetos con OpenCV y Python

Detector de bordes Canny cmo contar objetos con OpenCV y


Python
Luis del Valle Hernndez

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

1 El proceso para contar objetos con OpenCV


2 Convertir la imagen en escala de grises con OpenCV
3 Filtrado del ruido en una imagen
4 Detector de bordes Canny
5 Detector de bordes Canny con OpenCV
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
6 Buscar los contornos de una imagen
7 Dibujar los contornos en una imagen con OpenCV
8 Algoritmo para contar objetos con OpenCV
9 Cdigo completo para contar objetos con OpenCV y Python
10 Conclusin detector de bordes Canny para contar objetos con OpenCV

El proceso para contar objetos con OpenCV


Este proceso involucra varias fases que nos permitirn aislar los objetos dentro de una imagen.
Vamos a ir viendo el algoritmo para contar objetos con OpenCV con un caso prctico. Vamos a
contar las monedas que hay en la siguiente imagen.

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.

El proceso se divide en 5 fases que iremos viendo a lo largo de este tutorial:

1. Convertir la imagen a escala de grises


2. Filtrar la imagen para eliminar el ruido
3. Aplicar el detector de bordes Canny
4. Buscar los contornos dentro de los bordes detectados
5. Dibujar dichos contornos

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

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
Puedes seguir la gua para instalar OpenCV en Windows.

Convertir la imagen en escala de grises con OpenCV


Una vez que has cargado la imagen, lo primero que tienes que hacer es convertir a escala de
grises con OpenCV. Cuando trabajamos con imgenes a color, el coste computacional crece de
manera exponencial.

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

imagenconvertida: es la imagen resultante en el nuevo espacio de color.


imagen: es la imagen original. Tenemos que saber que espacio de color utiliza.
tipo_conversion: es una constante que indica de que espacio a que espacio vamos a
convertir.
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
El ltimo parmetro, tipo_conversin, nos permite convertir entre varios espacios de color. Si lo
que queremos es convertir entre RGB (en OpenCV se nombra BGR por temas histricos) a escala
de grises, el tipo_conversin es cv2.COLOR_BGR2GRAY.

La sentencia final quedara de la siguiente manera:

Puedes ver todos los tipos de conversiones entre los diferentes espacios aqu.

Filtrado del ruido en una imagen


Las imgenes digitales no son perfectas. El ruido inherente de los propios dispositivos o los
efectos contraproducentes por iluminacin alteran la realidad.

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.

Filtro Guassiano para la eliminacin de ruido en imgenes


El filtrado Gaussiano es igual que un promediado pero ponderado. Esta ponderacin se hace
siguiendo la Campana de Gauss. Con esto se consigue dar ms importancia a los pxeles que
estn ms cerca del centro de los que estn ms alejados.

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.

Por ejemplo, la altura de la poblacin o el coeficiente intelectual se puede representar a a travs de


la Distribucin Normal. Gracias a su forma acampanada y simtrica, hace que los elementos que
estn ms cerca del centro sean los ms comunes. Por el contrario, los elementos ms lejanos
sern los ms raros o diferentes.

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.

En OpenCV tenemos un mtodo que nos ayuda a realizar el filtrado Gaussiano.

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.

Si aplicamos el filtro Gaussiano con un kernel de 55 el cdigo sera el siguiente.

Detector de bordes Canny


El proceso para detectar bordes con Canny se divide en 3 pasos.

Deteccin de bordes con Sobel


Supresin de pxeles fuera del borde
Aplicar umbral por histresis

Uno de los grandes inconvenientes de los algoritmos de la visin artificial es la parametrizacin.


Muchas tcnicas requieren establecer parmetros o condiciones iniciales segn cada
situacin. En muchas ocasiones esos parmetros son exclusivos para una determinada
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
iluminacin o perspectiva.

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.

Deteccin de bordes con Sobel


El detector de bordes Sobel se basa en el clculo de la primera derivada. Esta operacin
matemtica mide las evoluciones y los cambios de una variable. Bsicamente se centra en
detectar cambios de intensidad.

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.

Filtrado de bordes mediante la supresin non-maximun


El objetivo en esta fase es poder quedarnos con aquellos bordes que cumplan cierta condicin. En
el detector de bordes Canny sern aquellos que tengan como grosor 1.

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.

Aplicar umbral por histresis


La umbralizacin de imgenes nos permite tambin segmentar una imagen en sus
diferentes objetos. Bsicamente consiste en determinar un umbral por el cual se decide si un
pxel forma parte del fondo o forma parte de un objeto.

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.

Detector de bordes Canny con OpenCV


Todo este proceso puede ser extremadamente difcil de implementar por ti mismo. Gracias a
OpenCV todo esto resulta relativamente sencillo y prctico.

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.

El mtodo para calcular los bordes con el mtodo Canny es el siguiente.

Donde:

canny: es la imagen resultante. Aparecern los bordes detectados tras el proceso.


imagen: es la imagen original.
umbral_minimo: es el umbral mnimo en la umbralizacin por histresis
umbral_maximo: es el umbral mximo en la umbralizacin por histresis

Como ya he comentado, el umbral mnimo y el mximo depender de cada situacin. Debes


experimentar con la escena que ests analizando y elegir los ms adecuados.

Buscar los contornos de una imagen


Hay que saber la diferencia que existe entre un borde y un contorno. Los bordes, como hemos visto
anteriormente, son cambios de intensidad pronunciados. Sin embargo, un contorno es una

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:

imagen: es la imagen donde vamos a dibujar los contornos.


lista_contornos: es la lista de Python con los contornos.
numero_contornos: el nmero de contornos que queremos dibujar si son todos pasar -1.
color_RGB: es un array o tupla con el color RGB del contorno.
grosor: grosor de la lnea a dibujar.

Y con esto ya tendramos el algoritmo completo. Ahora vamos a unir todas las piezas y ver cmo
quedara el cdigo completo.

Algoritmo para contar objetos con OpenCV


Una vez que tenemos claro lo que tenemos que hacer, vamos a unir todas las piezas y componer el
cdigo que nos permitir contar las monedas o cualquier otro objeto dentro de una imagen.

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

Python + NumPy + CsiPy + Matplotlib

Nombre Email

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
DESCARGAR YA !!!

Importacin de libreras y carga de imagen en OpenCV

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).

La ltima lnea de cdigo muestra la imagen original.

Conversin a escala de grises y suavizado Gaussiano

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.

El ltimo parmetro es sigma () y representa la desviacin estndar en el eje X es decir, la


anchura de la campana Gaussiana, por defecto lo vamos a dejar a 0. Esto hace que el mtodo
ponga el valor ms adecuado de forma automtica.

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).

Cdigo completo para contar objetos con OpenCV y


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Cdigo completo para contar objetos con OpenCV y
Python
Como resumen de lo visto hasta ahora, te dejo a continuacin todo el cdigo. Puedes copiarlo y
pegarlo en tu ordenador para probarlo.

Gua introduccin Visin Artificial


Aprende a dar los primeros pasos dentro de esta tecnologa

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.

Conclusin detector de bordes Canny para contar


objetos con OpenCV
Hemos visto un ejemplo de cmo contar monedas, pero esto se puede utilizar para contar
cualquier tipo de objeto. Cuando vayas probando con diferentes imgenes, comprobars que en
muchos casos no es suficientemente preciso.

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.

Has probado algn otro algoritmo para contar objetos con


OpenCV?
Prueba el detector de bordes Canny para contar objetos con
OpenCV en otras imgenes y comparte tus resultados con
nosotros.
Si tienes dudas o quieres comentar algo, aqu abajo por favor.

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...]

C OPYR IGH T 2 0 1 7 PROGRAMAR FCIL AVISO LEGAL

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com

Anda mungkin juga menyukai