Python opencv color tracking

A continuación se muestra mi código de Python para rastrear objetos de color blanco.
Funciona, pero solo por unos segundos y luego toda la pantalla se vuelve negra y en algunas ocasiones no funciona.
Experimenté con el color azul y funciona, pero el blanco y el verde me están dando problemas:

import cv2 import numpy as np cap = cv2.VideoCapture(0) while(1): _, frame = cap.read() hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of white color in HSV # change it according to your need ! sensitivity = 15 lower_white = np.array([0,0,255-sensitivity]) upper_white = np.array([255,sensitivity,255]) # Threshold the HSV image to get only white colors mask = cv2.inRange(hsv, lower_white, upper_white) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame,frame, mask= mask) cv2.imshow('frame',frame) cv2.imshow('mask',mask) cv2.imshow('res',res) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows() 

Bueno, lo primero que debes saber es qué espacio de color estás utilizando. Solo un pequeño tutorial de espacios de color en OpenCV para Mat de tipo CV_8UC3 . (Imágenes de Wikipedia)

HSV

introduzca la descripción de la imagen aquí

En el espacio de color HSV (Tono, Saturación, Valor), H le da al color dominante el color, S la saturación del color, V la luminosidad. En OpenCV, los rangos son diferentes. S, V están en [0,255], mientras que H está en [0, 180]. Normalmente, H está en el rango [0,360] (el círculo completo), pero para encajar en un byte (256 valores diferentes) su valor se reduce a la mitad.

En HSV, es más fácil separar un solo color, ya que simplemente puede establecer el rango adecuado para H, y solo tenga cuidado de que S no sea demasiado pequeño (será casi blanco), y V no sea demasiado pequeño (será oscuro).

Por ejemplo, si necesita colores casi azules , necesita que H esté alrededor del valor 120 (por ejemplo, en [110,130]), y S, V no demasiado pequeño (por ejemplo, en [100,255]).

El blanco no es un tono (el arco iris no tiene color blanco), pero es una combinación de color.

En HSV, debe tomar todo el rango de H (H en [0, 180]), valores S muy pequeños (por ejemplo, S en [0, 25]) y valores V muy altos (por ejemplo, V en [230, 255] ). Esto corresponde básicamente a la parte superior del eje central del cono.


Entonces, para hacer que rastree objetos blancos en el espacio HSV, necesitas:

 lower_white = np.array([0, 0, 230]) upper_white = np.array([180, 25, 255]) 

O, ya que definió un valor de sensibilidad, como:

 sensitivity = 15 lower_white = np.array([0, 0, 255-sensitivity]) upper_white = np.array([180, sensitivity, 255]) 

Para otros colores:

 green = 60; blue = 120; yellow = 30; ... sensitivity = 15 // Change color with your actual color lower_color = np.array([color - sensitivity, 100, 100]) upper_color = np.array([color + sensitivity, 255, 255]) 

El valor H rojo es 0, por lo que debe tomar dos rangos y “O” juntos:

 sensitivity = 15 lower_red_0 = np.array([0, 100, 100]) upper_red_0 = np.array([sensitivity, 255, 255]) lower_red_1 = np.array([180 - sensitivity, 100, 100]) upper_red_1 = np.array([180, 255, 255]) mask_0 = cv2.inRange(hsv, lower_red_0 , upper_red_0); mask_1 = cv2.inRange(hsv, lower_red_1 , upper_red_1 ); mask = cv2.bitwise_or(mask1, mask2) 

¡Ahora deberías poder seguir cualquier color!