下面是我用于跟踪白色对象的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()
答案 0 :(得分:16)
嗯,首先你应该知道你正在使用什么颜色空间。
只是OpenCV中Mat
类型CV_8UC3
的一个小色彩空间教程。 (来自维基百科的图片)
在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)
现在你应该能够跟踪任何颜色了!