下面是我的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()发布于 2015-07-17 06:14:53
首先,你应该知道你使用的是什么颜色空间。这只是一个关于OpenCV中CV_8UC3类型Mat的色彩空间的小教程。(图片来自维基百科)
HSV

在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值(例如,S在0,25),以及非常高的V值(例如,V在230,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])Red H值为0,因此您需要取两个范围并对其进行“或”运算:
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)现在你应该能够跟踪任何颜色了!
https://stackoverflow.com/questions/31460267
复制相似问题