Python OpenCV 颜色跟踪

标签 python image opencv image-processing colors

下面是我用于跟踪白色物体的 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()

最佳答案

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

单纯疱疹病毒

enter image description here

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

在HSV空间中更容易分离单一颜色,因为你可以简单地为H设置合适的范围,注意S不要太小(它会接近白色),V不要太小(天会黑的)。

例如,如果您需要接近 blue 的颜色,则需要 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,因此您需要取两个范围并将它们“或”在一起:

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)

现在您应该能够追踪任何颜色了!

关于Python OpenCV 颜色跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31460267/

相关文章:

python - 这个用于计算食物账单的 python 代码有什么问题?

Javascript 如果 url 然后图像

opencv - 对象没有属性 'NamedWindow'

C++ - 将 unsigned char* 复制到新的 unsigned char* 数组

android - OpenCV_2.4.2_binary_pack_armv7a源代码是否打开

python - Keras 如何编写并行模型,用于多类预测

python - 从 pandas MultiIndex 数据框中选择特定列

python - numpy 中最接近的 0.2 倍数?

image - 提升图像上传,调整大小,存储在数据库中,显示

android - 根据点击的数字打开对话然后 Intent 图像