¡Hola! En este minitutorial voy a resolver una duda que mucha gente me ha comentado: cómo detectar múltiples colores en una imagen con OpenCV y Python.
¿Cómo se hace? Una forma es aplicando detección de color a la imagen, creando una máscara para cada color que uno quiera detectar: una máscara para los verdes, otra para los azules, otra para los rojos, amarillos… y juntarlos con la función cv2.add().
Los que no sepáis cómo detectar colores con OpenCV, deberíais seguir primero mi Tutorial de Detección de Colores con OpenCV y Python.
¿Hecho? Pues bien, poned un poco de música y empezamos.
1- Imagen estática
Para empezar vamos a detectar los tres colores rojo, verde y azul del logo de OpenCV y los uniremos en una sola máscara.
Guardad la imagen de arriba con el nombre opencv_logo.png . En el mismo directorio dónde se haya bajado la imagen, cread un nuevo fichero de python. ¡A programar se ha dicho!
Lo primero es lo de siempre: importar las librerías de OpenCV y Numpy, abrir la imagen y convertirla a espacio de color HSV.
import cv2 import numpy as np imagen = cv2.imread('opencv_logo.png') hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV)
Después, hay que crear un rango para cada color. Primero los azules y verdes:
#Rango de colores detectados: #Verdes: verde_bajos = np.array([49,50,50]) verde_altos = np.array([107, 255, 255]) #Azules: azul_bajos = np.array([100,65,75], dtype=np.uint8) azul_altos = np.array([130, 255, 255], dtype=np.uint8)
El rango de rojos es un poco más puñetero… si miráis la rueda de color hsv, veréis que el HUE de los rojos está entre 0 – 20, y 240 – 255 (más o menos).
Habrá que crear dos rangos diferentes para los rojos: uno que tenga el Hue entre 0 y 20 y el otro entre 240 y 255.
#Rojos: rojo_bajos1 = np.array([0,65,75], dtype=np.uint8) rojo_altos1 = np.array([12, 255, 255], dtype=np.uint8) rojo_bajos2 = np.array([240,65,75], dtype=np.uint8) rojo_altos2 = np.array([256, 255, 255], dtype=np.uint8)
Se crean las máscaras de la forma normal con la función inRange():
#Crear las mascaras mascara_verde = cv2.inRange(hsv, verde_bajos, verde_altos) mascara_rojo1 = cv2.inRange(hsv, rojo_bajos1, rojo_altos1) mascara_rojo2 = cv2.inRange(hsv, rojo_bajos2, rojo_altos2) mascara_azul = cv2.inRange(hsv, azul_bajos, azul_altos)
Ahora viene lo nuevo: se juntan las máscaras en una sola máscara final que llamaremos ‘mask’. La función cv2.add sólo puede recibir dos argumentos, por lo que habrá que aplicarla varias veces.
#Juntar todas las mascaras mask = cv2.add(mascara_rojo1, mascara_rojo2) mask = cv2.add(mask, mascara_verde) mask = cv2.add(mask, mascara_azul)
Para terminar mostramos la imagen inicial, la máscara y salimos al pulsar ESCAPE.
#Mostrar la mascara final y la imagen cv2.imshow('Finale', mask) cv2.imshow('Imagen', imagen) #Salir con ESC while(1): tecla = cv2.waitKey(5) & 0xFF if tecla == 27: break cv2.destroyAllWindows()
Al final tendréis algo como esto:
# Algoritmo de deteccion de colores multiples # Por Glar3 # www.robologs.net # # Busca los pixeles rojos, verdes y azules de una imagen import cv2 import numpy as np imagen = cv2.imread('opencv_logo.png') hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV) #Rango de colores detectados: #Verdes: verde_bajos = np.array([49,50,50]) verde_altos = np.array([107, 255, 255]) #Azules: azul_bajos = np.array([100,65,75], dtype=np.uint8) azul_altos = np.array([130, 255, 255], dtype=np.uint8) #Rojos: rojo_bajos1 = np.array([0,65,75], dtype=np.uint8) rojo_altos1 = np.array([12, 255, 255], dtype=np.uint8) rojo_bajos2 = np.array([240,65,75], dtype=np.uint8) rojo_altos2 = np.array([256, 255, 255], dtype=np.uint8) #Crear las mascaras mascara_verde = cv2.inRange(hsv, verde_bajos, verde_altos) mascara_rojo1 = cv2.inRange(hsv, rojo_bajos1, rojo_altos1) mascara_rojo2 = cv2.inRange(hsv, rojo_bajos2, rojo_altos2) mascara_azul = cv2.inRange(hsv, azul_bajos, azul_altos) #Juntar todas las mascaras mask = cv2.add(mascara_rojo1, mascara_rojo2) mask = cv2.add(mask, mascara_verde) mask = cv2.add(mask, mascara_azul) #Mostrar la mascara final y la imagen cv2.imshow('Finale', mask) cv2.imshow('Imagen', imagen) #Salir con ESC while(1): tecla = cv2.waitKey(5) & 0xFF if tecla == 27: break cv2.destroyAllWindows()
2- Vídeo en tiempo real:
Este otro programa es para detectar colores en un vídeo tomado por una webcam en tiempo real. Esta vez detectaremos objetos verdes y amarillos.
No voy a comentarlo línea por línea como el programa anterior porque la idea es la misma. Además el tutorial que he mencionado al principio explica cómo utilizar una webcam.
#Algoritmo de deteccion de colores #Por Glar3 #www.robologs.net # #Detecta objetos verdes y amarillos import cv2 import numpy as np #Iniciar la camara captura = cv2.VideoCapture(0) while(1): #Capturamos una imagen y la convertimos de RGB -> HSV _, imagen = captura.read() hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV) #Rango de colores detectados: #Verdes: verde_bajos = np.array([49,50,50], dtype=np.uint8) verde_altos = np.array([100, 255, 210], dtype=np.uint8) #Amarillos: amarillo_bajos = np.array([16,76,72], dtype=np.uint8) amarillo_altos = np.array([30, 255, 210], dtype=np.uint8) #Detectar los pixeles de la imagen que esten dentro del rango de verdes mascara_verde = cv2.inRange(hsv, verde_bajos, verde_altos) #Detectar los pixeles de la imagen que esten dentro del rango de amarillos mascara_amarillo = cv2.inRange(hsv, amarillo_bajos, amarillo_altos) #Filtrar el ruido aplicando un OPEN seguido de un CLOSE kernel = np.ones((6,6),np.uint8) mascara_verde = cv2.morphologyEx(mascara_verde, cv2.MORPH_CLOSE, kernel) mascara_verde = cv2.morphologyEx(mascara_verde, cv2.MORPH_OPEN, kernel) mascara_amarillo = cv2.morphologyEx(mascara_amarillo, cv2.MORPH_CLOSE, kernel) mascara_amarillo = cv2.morphologyEx(mascara_amarillo, cv2.MORPH_OPEN, kernel) #Unir las dos mascaras con el comando cv2.add() mask = cv2.add(mascara_amarillo, mascara_verde) #Mostrar la imagen de la webcam y la mascara verde cv2.imshow('verde', mask) cv2.imshow('Camara', imagen) tecla = cv2.waitKey(5) & 0xFF if tecla == 27: break cv2.destroyAllWindows()
Al igual que antes se sale con ESCAPE.
Bueno, espero que esto resuelva vuestras dudas sobre cómo detectar varios colores a la vez con OpenCV. Si queréis preguntarme algo más, mis circuitos visuales leerán vuestros comentarios con fruición.
¡Hasta la próxima!
Actualización 3/11/2016: Resolución de errores frecuentes con OpenCV+Python
hola buenas un favor si quisiera hacer el mismo codigo con java o c++ como quedaria
buenas tardes
hay alguna forma de saber el porcentaje de verde de la imagen?
no se de fotografia ni de programacion
lo necesito para mi tesis sobre grado de cobertura de una especie vegetal
saludos
¡Hola, Paula! Puedes utilizar la función cv2.countNonZero() para contar el número de píxeles blancos de la máscara al hacer la detección de colores, y luego dividirlo por el número total de píxeles para saber el porcentaje.
Aquí puedes encontrar la documentación de la función (tendrás que bajar un poco para encontrarla): https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html
¡Un saludo!
hola queria saber como puedo mostrar en pantalla o guardar las coordenadas en una variable?
lo que pasa es que segun las coordenadas quiero que se mueva un motor ( la parte del motor esta lista) pero mi problema es encontrar las coordenadas de X color cuando este en movimiento ya que lo guardare en una variable y asi poder mandarlo al puerto “serial x
“
¡Hola Roderick! En este otro tutorial se explica, entre otras cosas, como encontrar el centroide (coordenadas x, y) de una región de color.
http://robologs.net/2014/07/02/deteccion-de-colores-con-opencv-y-python/
¡Un saludo!
Muy buenas tardes.
Estoy realizando un código de reconocimiento de maleza, ya lo tengo en blanco y negro, me gustaría saber cómo paso este reconocimiento al vídeo de color con una franja verde que me indique lo que quiero reconocer.
Muchas gracias
¡Buenas, Camilo! Entiendo que cuándo dices que lo tienes en blanco y negro, te refieres a que has calculado la máscara, ¿no? Y ahora lo quieres es encontrar el contorno de esta máscara y dibujarlo. Es fácil: este código buscará los contornos en la máscara, y los dibujará sobre la imagen original si son mayores de un cierto tamaño. _, contours = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) for c in contours: area = cv2.contourArea(c) #He puesto un umbral de 1000, puede que tengas que cambiarlo. if area > 1000: cv2.drawContours(imagen, contour, 3, (0, 255, 0),1) ¡Un saludo!
Bueno, por mucho que lo intento no hay forma de que el código quede bien formateado en el comentario. Si quieres mándame un correo a contacto@robologs.net y te mando el código bien escrito.
y que version de opencv por que ya instale varias pero me marca error al importar estoy usando python 7.12 porfavor
¡Hola! Para este tutorial usé OpenCV 2 con Python 2.7.12, y la versión 1.11 de Numpy.
que version de numpy usaste
Hola Gl4r3.
Una consulta. ¿Como podría distinguir los colores rojo y azul?
Por ejemplo:
Si tengo en una parte del vídeo el color rojo y en otra parte de ese mismo vídeo el color azul. ¿Como podría distinguir esos colores?.
Es que quiero distinguir esos colores, e ir llenando en un arreglo de 3*3 de (0 ó 1) según en que parte del vídeo se encuentra.
¡Hola, Erick! Cuándo dices “en una parte del vídeo”, ¿te refieres a una parte del mismo frame, o que a partir de algun momento en el vídeo quieres dejar de detectar rojos para pasar a detectar azules?
Gracias por responder. Si, me refería al mismo frame pero ya lo pude solucionar. Ahora utilizo Azul y Verde.
Pero tengo problemas con esos colores ya que muestro el azul y me detecta el verde.
Utilice el rango de colores que usted nos mostró aquí
¿Sera mi webcam (640*480) que no diferencia o el rango de colores que tengo mal?
¡Hola de nuevo! Necesitaria ver el código para poder saber exactamente dónde está el error, pero puedes revisar que tengas correctamente el rango de colores (que no hayas copiado el que no toque).
Por otra parte: ¿Has convertido el frame de la webcam al espacio de color HSV?
¡Un saludo!
Hola! Ahora lo que he hecho es cambiar la detección de colores por detectar los contornos de una figura, ya que la iluminación me daba muchos problemas.
He estado viendo su tutorial de Detección de triángulos con OpenCV y Python. Hice una pregunta ahí. Gracias por su aporte.
Amigo disculpe me sale error
Traceback (most recent call last):
File “C:/Users/WIN8/Desktop/ASASA.py”, line 5, in
hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV)
error: OpenCV(3.4.1) C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp:11214: error: (-215) (scn == 3 || scn == 4) && (depth == 0 || depth == 5) in function cv::cvtColor
¡Hola, Kevin! Al final del tutorial hay un enlace que pone “Actualización 3/11/2016: Resolución de errores frecuentes con OpenCV+Python”. Tu error es uno de los que están resueltos.
Hola Gl4r3, gracias por tu tutorial está excelente, mi consulta es sobre un proyecto que vengo analizando de como reconocer unas plagas y al aplicar la codificación HSV y luego una mascara aun me aparece mucho ruido de fondo que confunde el objeto que quiero extraer, como puedo eliminarlo si poseen la misma iluminacion por el sol hojas y el tono de la plaga?
¡Hola, Joel! En estos casos el proceso es un poco más largo. Te paso un enlace que explica la solución a tu problema: http://answers.opencv.org/question/26280/background-color-similar-to-object-color-how-isolate-it/
¡Un saludo!
Hola, muchas gracias por toda tu aportación.
Mi problema es que tengo una imagen de un jardin y quiero dectertar lo que unicamente es cesped, entonces cuando hay arboles, y claro tambien son verdes ¿ como hago para detectar solo lo que es cesped?
Gracias,
Saludos
¡Hola Sílvia! Pues la verdad es que no hay una respuesta fácil a tu pregunta. Si no puedes ajustar bien los rangos de color para que sólo te detecte el césped, tendrás que probarlo con algoritmos más avanzados. Te doy dos sugerencias, pero tendrás que investigar por tu cuenta:
-Si los árboles están en el fondo de la imagen, podrías probar a eliminarlos de la imagen extrayendo sólo lo que esté en primer plano: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html#grabcut
-Haarcascades. Puedes intentar crear tu propia Haarcascade para detectar árboles, extraer su bounding box y eliminar la región de la imagen. (https://stackoverflow.com/questions/2000816/how-to-create-haar-cascade-xml-file-to-use-in-opencv)
¡Un saludo!
¡Hola que tal!, primeramente muchas gracias por todo este contenido, ¡es muy bueno! Ando en proceso de un proyecto, el cual quisiera que detecte los colores del cubo rubik, que en la imagen aparecieran recuadros tales que al poner el cubo rubik entre esos recuadros, se capture el color capturado por cada recuadro exactamente y al final presente el juego de colores de ese conjunto de recuadros, es decir, la cara completa del cubo rubik.
Algo como esto: https://www.youtube.com/watch?v=Vnwv_xW-Fls
Muchas gracias
¡Hola, Rigel!
Una cosa que podrías hacer es, al igual que el vídeo, recortar 9 regiones en el centro de la imagen y guardarlas como imágenes a parte. Para ver como recortar una imagen, consulta este enlace: https://stackoverflow.com/questions/15589517/how-to-crop-an-image-in-opencv-using-python
Una vez tengas las 9 imágenes, puedes aplicar detección de color con todos los colores del cubo de Rubik (rojo, verde, azul, blanco, naranja y amarillo). Después, creas una matriz de 3×3 dónde guardas el resultado de la detección de color.
¡Un saludo!
hola , gran tutorial pero tengo una duda, no entiendo como se escogen los colores para luego añadirlos al programa osea hsv solo tiene para 3 valores para agregar por ejemplo np.array([110,50,50])
np.array([130,255,255])
como se ponen los colores en hsv para esas dos lineas
¡Hola SemiDiosXD!
Estos dos arrays muestran los valores MÍNIMOS y MÁXIMOS de Hue, Saturation y Value que va a detectar nuestro programa. En este caso en concreto, detectará todos los píxeles de la imagen cuyo Hue esté entre 110 y 130, el Saturation entre 50 y 255 y el Value entre 50 y 255. Espero que esto haya resuelto tu duda ^-^
Saludos, mi consulta es por que manejaste los rangos en el modelo HSV o cual fue tu criterio para cambiar del modelo RGB. Gracias
¡Hola, Daniel! El espacio de color HSV es más práctico para establecer los rangos de colores para detectar que el RGB.
Hola, quisiera saber si puedo detectar el color blanco, ya que probé una vez con ciertos valores y no me lo detecto, o que valores son los que pondría ?
¡Hola, Piero! Yo quizá pondría:
Hue: 0-255
Saturation: 0-70 (valores bajos, te interesa poca saturación)
Value: 200-255 (valores altos, te interesan colores luminosos)
¡Un saludo!
Hola , mi duda es la siguiente : Quisiera condicionar que cada color haga algo como activar una función o un Led así decirlo .¿como lo podría hacer?
¡Hola, Enzo! Una cosa que puedes hacer es aplicar detección de color para varios colores, y guardar el área de cada uno de los colores. Después añades un condicional, y si esta área es mayor que cierto número de píxeles llamas a la función que quieras.
Esto es la idea básica. Intenta hacerlo y si no lo consigues vuelve a escribirme ^-^
¡Un saludo!
Hola, cuando hago la detección me detecta solo verde y azul, y cuando pongo rojo no detecta nada, a alguien más le pasó ? Saludos
¡Hola, Benjamín! Puede ser que debido al tipo de webcam que tengas, la iluminación de la habitación, etc, el rojo no lo detecte como tal. Intenta jugar un poco con los valores de los vectores de rojo.
hola tenia una duda y queria ver si me podrias ayudar con eso, me gustaria manejar una imagen hsv pero en lugar de tener h, s y v “juntos” quisiera saber si hay alguna forma de pasar la capa “h” a otra variable y que sea una matriz aparte?
¡Hola Kamelaz! Léete este enlace, aquí lo hacen para una imagen RGB pero la idea es la misma: http://answers.opencv.org/question/13575/how-to-extract-red-color-plane-in-opencv-c/
Hola, me encanto este tutorial pero tengo un problemita. La cámara me va muy lenta y no se como hacer para aumentar los fps.
¡Hola, Jesús! Puedes intentar reducir la resolución de la imagen. Léete este enlace: https://stackoverflow.com/questions/22840797/change-opencv-video-file-resolution
¡Un saludo!
Me sirvió. Gracias!
¡Que versión de Python usas ?
¡Hola, Jack! Este tutorial lo hice con la versión 2.7.12
NO FUNCIONA TU WAADA
¿Te sale algún mensaje de error?
buenos dias, tengo una pregunta es que me sale error en la linea 30: mascara_verde = cv2.inRange(hsv, verde_bajos, verde_altos). Me dice que hsv no la tengo definida:
name error: name ‘hsv’ is not defined
¡Hola, daniel! ¿Cuál de los dos códigos de ejemplo estás intentando correr?
Hola, soy nuevo en esto, tengo una tarea en la que debo detectar esos colores, y si se detecta un color, debo encender con la ayuda de un microcontrolador un led del respectivo color, mi pregunta es: ¿Que condicion debo utilizar para tener esas condiciones? Es a tiempo real el procedimiento asi que imagino que debo aplicarlo en la variable (en tu caso imagen), pero no se si deba usar alguna condicion if u opencv tenga alguna funcion para ello, o de alguna manera leer pixeles que da el HSV, aun no comprendo muy bien este tema. Lo estoy realizando… Leer más »
¡Hola, Armando! Lo que yo haría sería crear una región de interés en la imagen y calcular la media de R, G y B de esta región. Después es fácil encender cada led con más o menos intensidad según los valores calculados, ¿no?
¡Un saludo!
Hola GL4R3, estoy siguiendo tus programaciones son muy buenas, tengo una duda con esta, he revisado el codigo de HSV en gimp, pero la escala que me resulta en S va de 0 a 100% y lo mismo en V de 0 a 100%, pero veo q en la programacion usted utiliza el valor de 255 quisiera saber de donde obtuvo ese valor o como lo transformo, ya que quiero detectar otros colores pero no encuentro la forma de ponerlo como usted, en verde me sale que el maximo es H=120° S=100% y V=100%, luego como usted saca 80 255… Leer más »
¡Hola Patricio! Los rangos H, S y V de OpenCV van de 0 a 255, pero algunos programas tienen el valor de H que va de 0 a 360. En este caso, el 360 de Gimp se correspondería al 255 (con el valor de S y V pasa lo mismo, pero va de 0 a 100). Para convertir el rango de valores de Gimp al rango de valores de OpenCV sólo tienes que hacer una regla de tres de las que hacíamos en el colegio. Por ejemplo, para convertir 0-360 a 0-255 se haría: H_convertido = H_gimp*255/360 Dónde H_convertido es… Leer más »
muchas gracias, si intente por regla de 3 pero no tome en cuenta que el valor de OpenCV va de 0-255 muchas gracias por la respuesta y t agradezco por tus tutoriales son muy buenos saludos
¡De nada, Patricio! ¡Suerte con tus proyectos!
Buena tarde, gracias por el tutorial. ¿Existe alguna manera de identificar que color fue el detectado, es decir, saber si se detectó el verde o el azul? pretendo mandar por serial un nombre del color y prender un led.
Hola! Una posibilidad rápida es aplicar detección de colores con distintos arrays de máximos y míninimos para saber qué color se está detectando: primero intentas detectar verdes, después rojos, después amarillos…
Gracias eso había echo solo que pensé que había alguna manera más limpia, también e investigado que con moments puedo sacar el centroide del objeto detectado y luego ver si ese pixel es verde o azul por ejemplo, y con eso poder diferenciar pero aún no logro aplicarlo, cuándo lo logre lo comparto, gracias N4n0.
Buenas, sabras como poder hacer condiciones con esto por ejemplo que me mande algun mensaje si es de color azul, o otro mensaje si es de otro color
Buenas noches, muy buenos los tutoriales todos me han funcionado bien pero no entiendo porque en este no me funciona cv2.cvtColor(…), este es el error que me sale:
OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulesimgprocsrccolor.cpp, line 7946
Traceback (most recent call last):
File “C:UsershpMy DocumentsLiClipse WorkspaceOPENCVcOpenCV__init__.py”, line 5, in
hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV)
cv2.error: C:buildsmaster_PackSlaveAddon-win32-vc12-staticopencvmodulesimgprocsrccolor.cpp:7946: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::cvtColor
De antemano muchas gracias
Encontre el error jajaj la imagen no estaba en la carpeta, la proxima vez voy a leer los comentarios si alguien tiene algun error parecido.
Hola! Me encantan estos tutoriales, y me estan siendo muy utiles, en especial este. Ahora quiero hacer una pregunta. Como podría hacer para ademas de color, discriminar por forma?, ambos a la vez.
Aquí tienes ^^
http://robologs.net/2015/01/25/deteccion-de-triangulos-con-opencv-y-python/
[…] cuándo la cámara empiece a capturar imágenes. Para que véais como hacerlo, el código del tutorial para detectar varios colores quedaría […]
Antes que nada quiero felicitarte por el gran trabajo que haces al compartir tus conocimientos en cada uno de tus tutoriales.
Tengo un problemilla cuando corro el programa desde una imagen estática, me aparece el siguiente error:
Traceback (most recent call last):
File “C:/Python27/DetectaMultipleColores.py”, line 7, in
hsv = cv2.cvtColor(imagen, cv2.COLOR_BGR2HSV)
error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\imgproc\src\color.cpp:7646: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::ipp_cvtColor
De antemano muchas gracias.
Encontré el error…no me dí cuenta que la imagen no estaba en la carpeta donde se encuentra el script, moví el archivo de la imagen a la carpeta donde esta el script y el error se solucionó 🙂 . Aún así aprovecho para volver a agradecer por compartir tus conocimientos, saludos desde México.
Perfecto ^^
Hola una consulta, como podria hacerse para que detecte varios objetos de color verde? probe tu codigo y solo detecta 1 objeto de color verde pero si se usan varios objetos se marea. Saludos y muchas gracias, eres un gran aporte a la comunidad amigo :).
¡Hola! Si quieres detectar varios objetos, la idea es un poco diferente. Lee este tutorial, que explica como detectar triángulos azules (http://robologs.net/2015/01/25/deteccion-de-triangulos-con-opencv-y-python/). Quédate en cómo extraer el contorno de cada objeto (línea 38) Para encontrar el centro de cada objeto, puedes hacer un bucle for que recorra todo el array de contornos, calcule los centros y los pinte en la ventana: for contorno in contours: mom = cv2.moments(contorno) centro_x = int(mom['m10']/mom['m00']) centro_y = int(mom['m01']/mom['m00']) cv2.rectangle(imagen, (centro_x, centro_y), (centro_x+2, centro_y+2),(0,0,255), 2) ¡Y ya está! Como esta es una pregunta que mucha gente me hace, un rato voy a cambiar el código… Leer más »
Hola Gl4r3, necesito tu ayuda por farvor. A la hora de correr el programa me sale un error y no se como solucionarlo. El erro es el siguiente:
error:/home/pi/opencv-3.1.0/modules/imgproc/src/color.cpp: 8141: error: (-215)(scn ==3, scn == 4) && (depth == CV_8U, depth == CV_32f) in fuction cvtColor.
Seria de gran ayuda que me pudieras solucionar el problema. Gracias
¡Hola, José! Esto es porque la imagen que OpenCV está intentando analizar está vacía. ¿Estás utilizando el código de la imagen estática? Si es así asegúrate de que el nombre de tu imagen está correcto.
De echo Gl4r3 estoy usando una cámara compatible con Raspberri y estoy capturando vídeo en tiempo real, y aun sigo con el mismo problema. Es un proyecto de escuela en el cual un brazo robótico separa piezas dependiendo de su color o forma actualmente estoy procesando puros clores.
¡Hola José! Perdona la tardanza. Mírate este artículo que acabo de publicar: http://robologs.net/2016/11/03/opencvpython-resolucion-de-errores-frecuentes/
En el punto 2 explico cómo resolver tu problema cuándo se captura imagen con una webcam.
¡Un saludo!
Hola glare, como puedo hacer para saber cual color se detectó en mayor proporción
intento hacerlo de esta manera pero siempre me arroja no
if np.array_equal(mask, mascara_verde):
print “verde”
else:
print “no”
AAAIIIIUUUUUUDAA
¡Hola Ricardo! Mírate la documentación oficial de OpenCV sobre histogramas de color: http://docs.opencv.org/3.1.0/d1/db7/tutorial_py_histogram_begins.html
Clare tu blog es fantástico!… te comento lo de que deseo y espero me puedas orientar: necesito un algoritmo en Python que emplee la librería OpenCV que dado un vídeo 4K y 360 grados de la toma de un árbol frutal haga un reconocimiento automático y el conteo de las frutas en ese árbol. Sabes si existe? Has hecho algo similar que me puedas compartir?
¡Hola, JorgeG! Voy a saltarme el paso de detectar el color de las frutas, que es lo que cuenta este tutorial. Sólo voy a explicarte cómo contar frutas, ¿vale?
La idea es que una vez tienes la máscara en blanco y negro tienes que contar el número de “manchas blancas” que hay.
Hay una función de OpenCV llamada cv2.findContours() que detecta los contornos de una máscara. Por tanto, si tienes la máscara llamada ‘mask’ puedes detectar el número de manchas blancas (es decir, de frutas en el árbol) con este código:
That’s it!
Buen tutorial por si te interesa Adrian Rosebrock creador del blog http://pyimagesearch.com/ desarrollo unos scripts en python que puedes instalar con pip (pip install imutils) entre los cuales veras incluido un pequeño script con trackbars para visualizar diferentes rangos de colores . Si te interesa opencv Adrian es especialista en procesamiento de imagenes y pone recursos muy interesantes en su blog . Yo personalmente os seguire a ambos sin dudarlo.
Gracias por el enlace! De hecho ya conocía pyimagesearch, es MUY buen blog para aprender OpenCV. Y he de admitir que en muchas cosas supera mis humildes tutoriales…
Pues no conocia el paquete imutils, gracias por mencionarlo! Voy a echarle una ojeada en cuanto tenga tiempo.
Un saludo, Aprendiz!
Gracias!!!! glare, una consulta para el vídeo en tiempo real, se puede usar el primer código, unir mas mascaras y así tener mas colores?
Por supuesto! Estos dos códigos son solo ejemplos, puedes unir todas las máscaras que quieras!
Que pasa, Glare? Hoy no pones música clásica en el tutorial!
Te han reprogramado?? D:
Awwww es verdad, me la he dejado!! Y no, no me han reprogramado…
Entonces, ¿Qué tal un poco de música ambiental?
https://www.youtube.com/watch?v=jfLr1d40uZ8
No es música clásica pero suena bien!
Agradecido por el tutorial aprendi bastante sobre todo con respecto al rango de colores. Tengo la duda estuve buscando en gimp y inkscape el rango, sin embargo los valores que aparecen en tu programa son diferentes. Es decir No logro ubicarlo, tu programa al pelo. Sería interesante ver como en inkscape se logra esto. Gracias
¡Hola Luís! ¿Te has leído este tutorial (http://robologs.net/2014/07/02/deteccion-de-colores-con-opencv-y-python/), el apartado dónde pone “Actualización 12/11/2015”? Ahí explico cómo encontrar el rango de valores con un programa como GIMP o Inkscape.