python opencv颜色跟踪

时间:2015-07-16 16:57:55

标签: python opencv

下面是我用于跟踪白色对象的python代码 它可以工作 - 但只有几秒钟,然后整个屏幕变黑,有时候它不起作用。
我尝试了蓝色并且它有效 - 但白色和绿色给我带来了问题:

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()

1 个答案:

答案 0 :(得分:16)

嗯,首先你应该知道你正在使用什么颜色空间。 只是OpenCV中Mat类型CV_8UC3的一个小色彩空间教程。 (来自维基百科的图片)

HSV

enter image description here

在HSV(色调,饱和度,值)颜色空间中,H给出颜色主色,S给出颜色的饱和度,V给出亮度。在OpenCV中,范围是不同的。 S,V在[0,255]中,而H在[0,180]中。通常H在[0,360]范围内(整圆),但为了适合一个字节(256个不同的值),它的值减半。

在HSV空间中更容易分离单个颜色,因为您可以简单地设置H的适当范围,并且只需要注意S不要太小(它几乎是白色),并且V不是太小(它会是黑暗的。)

因此,例如,如果你需要几乎蓝色颜色,你需要H大约为120(比如[110,130]),而S,V不要太小(比如[100,255] ])。

白色不是色调(彩虹中没有白色),但它是颜色的组合。

在HSV中,您需要获取所有范围的H(H在[0,180]中),非常小的S值(比如[0,25]中的S)和非常高的V值(比如[230]中的V ,255])。这基本上对应于锥体中心轴的上部。

因此,要使其跟踪HSV空间中的白色物体,您需要:

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

或者,因为您定义了灵敏度值,例如:

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

其他颜色:

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])

红色H值为0,因此您需要采用两个范围和" OR"他们在一起:

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)

现在你应该能够跟踪任何颜色了!