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

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
Post a Comment