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

那么,首先你应该知道你使用的是什么色彩空间。 只是一个小型的CV_8UC3types的OpenCV for Mat空间的教程。 (来自维基百科的图片)

HSV

在这里输入图像描述

在HSV(Hue,Saturation,Value)色彩空间中,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,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) 

现在你应该可以跟踪任何颜色!