¿Cómo encontrar las regiones de color ROJO utilizando OpenCV?

Estoy tratando de hacer un progtwig donde detecto rojo. Sin embargo, a veces es más oscuro de lo normal, así que no puedo usar un solo valor. ¿Cuál es un buen rango para detectar diferentes tonos de rojo? Actualmente estoy usando el rango 128, 0, 0 – 255, 60, 60, pero a veces ni siquiera detecta un objeto rojo que puse delante de él.

RGB no es un buen espacio de color para la detección de colores específicos. HSV será una buena opción.

Para ROJO, puede elegir el rango HSV (0,50,20) ~ (5,255,255) y (175,50,20)~(180,255,255) usando el siguiente mapa de colores. Por supuesto, la RED range no es tan precisa, pero está bien.

introduzca la descripción de la imagen aquí

El código tomado de mi otra respuesta: Detectar si un píxel es rojo o no

 #!/usr/bin/python3 # 2018.07.08 10:39:15 CST # 2018.07.08 11:09:44 CST import cv2 import numpy as np ## Read and merge img = cv2.imread("ColorChecker.png") img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) ## Gen lower mask (0-5) and upper mask (175-180) of RED mask1 = cv2.inRange(img_hsv, (0,50,20), (5,255,255)) mask2 = cv2.inRange(img_hsv, (175,50,20), (180,255,255)) ## Merge the mask and crop the red regions mask = cv2.bitwise_or(mask1, mask2 ) croped = cv2.bitwise_and(img, img, mask=mask) ## Display cv2.imshow("mask", mask) cv2.imshow("croped", croped) cv2.waitKey() 

introduzca la descripción de la imagen aquí

Respuestas relacionadas:

  1. Elegir los límites HSV superiores e inferiores correctos para la detección de color con `cv :: inRange` (OpenCV)
  2. Cómo definir un valor de umbral para detectar solo objetos de color verde en una imagen: Opencv
  3. ¿Cómo detectar dos colores diferentes usando `cv2.inRange` en Python-OpenCV?
  4. Detectar si un píxel es rojo o no

Por supuesto, para la pregunta específica, quizás otro espacio de color también esté bien.

¿Cómo leer la aguja del medidor de utilidad con opencv?

Podría comprobar que el componente rojo es el máximo y que los otros son claramente más bajos:

 def red(r, g, b): threshold = max(r, g, b) return ( threshold > 8 # stay away from black and r == threshold # red is biggest component and g < threshold*0.5 # green is much smaller and b < threshold*0.5 # so is b ) 

Esto puede ser implementado muy eficientemente usando numpy.

La "forma correcta" sería hacer una conversión completa a HSV y verificar allí, pero será más lenta y algo más complicada (el tono es un ángulo, por lo que no se puede tomar el valor absoluto de la diferencia, además, los colores son como (255, 254). , 254) serán calificados como "rojos" incluso si se consideran blancos para un ser humano).

Tenga en cuenta también que el sistema visual humano tiende a compensar el promedio, por lo que algo podría verse como "azul", incluso si el componente más grande es rojo, pero todo en la imagen es rojo, por lo que "no cuenta" para nuestro cerebro.

En la imagen de abajo, si le pregunta a un humano qué color es la parte en el área del círculo, la mayoría diría "azul", mientras que el componente más grande es el rojo:

Una lenna rojiza

Por favor, use HSV o HSL (tono, saturación, luminancia) en lugar de RGB, en HSV, el color rojo se puede detectar fácilmente usando el valor de hue dentro de algún umbral.

El color rojo significa que el valor rojo es más alto que el azul y el verde.

Para que pueda comprobar las diferencias entre rojo y azul, rojo y verde.

Simplemente puede dividir RGB en canales individuales y aplicar un umbral como este.

 b,g,r = cv2.split(img_rgb) rg = r - g rb = r - b rg = np.clip(rg, 0, 255) rb = np.clip(rb, 0, 255) mask1 = cv2.inRange(rg, 50, 255) mask2 = cv2.inRange(rb, 50, 255) mask = cv2.bitwise_and(mask1, mask2) 

Espero que pueda ser una solución para su problema.

Gracias.