python opencv color tracking -


below python code tracking white color objects.
works - few seconds , whole screen turns black , in times not work.
i experimented blue color , works - white , green giving me problems:

import cv2 import numpy 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 according need ! sensitivity = 15 lower_white = np.array([0,0,255-sensitivity]) upper_white = np.array([255,sensitivity,255])  # threshold hsv image white colors mask = cv2.inrange(hsv, lower_white, upper_white) # bitwise-and mask , 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() 

well, first thing should know color space using. small tutorial of color spaces in opencv mat of type cv_8uc3. (images wikipedia)

hsv

enter image description here

in hsv (hue, saturation, value) color space, h gives color dominant color, s saturation of color, v lightness. in opencv, ranges different. s,v in [0,255], while h in [0, 180]. typically h in range [0,360] (the full circle), fit in byte (256 different values) it's value halved.

in hsv space easier separate single color, since can set proper range h, , take care s not small (it white), , v not small (it dark).

so example, if need blue colors, need h around value 120 (say in [110,130]), , s,v not small (say in [100,255]).

white not hue (the rainbow doesn't have white color in it), combination of color.

in hsv, need take range of h (h in [0, 180]), small s values (say s in [0, 25]), , high v values (say v in [230, 255]). corresponds upper part of central axis of cone.


so make track white objects in hsv space, need:

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

or, since defined sensitivity value, like:

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

for other colors:

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

red h value 0, need take 2 ranges , "or" them together:

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) 

now should able track color!


Comments