2015-10-18 309 views
3

我想使用OpenCV和Python执行简单的彩色对象检测。使用OpenCV和Python检测HSV图像颜色的问题

我已经阅读了几个教程,但是我遇到了一个令人困惑的问题,它阻止了我的进步。尽管我提供了正确的HSV数据,但我的程序似乎没有检测到该颜色的对象。

我用这个图片(对不起,我的摄像头质量差):

Sample

为了检测红色的物体,我恢复的HSV色彩数据:

Color data

这里是我的代码:

YELLOW = 30 
BLUE = 210 
GREEN = 145 
RED = 320 

color = RED 

img = cv2.imread("sample.png") 

hue = color // 2 

lower_range = np.array([max(0, hue - 10), 0, 0], dtype=np.uint8) 
upper_range = np.array([min(180, hue + 10), 255, 255], dtype=np.uint8) 

img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 

mask = cv2.inRange(img, lower_range, upper_range) 

binary_img = cv2.bitwise_and(img_hsv, img_hsv, mask=mask) 
binary_img = cv2.cvtColor(binary_img, cv2.COLOR_BGR2GRAY) 
_, binary_img = cv2.threshold(binary_img, 127, 255, cv2.THRESH_BINARY) 

cv2.imshow('sample', binary_img) 
cv2.waitKey(0) 

结果:

Result

结果为他人的颜色是正确的(不完美,因为质量差的我猜的),但我不能得到的东西为红色。然而,HSV变换的图像是相当明确的:

HSV Image

你明白我做错了吗?

回答

3

你正在做的一切都是正确的,唯一的问题是你在BGR图像上应用了你的阈值而不是HSV。

变化:

mask = cv2.inRange(img, lower_range, upper_range) 

mask = cv2.inRange(img_hsv, lower_range, upper_range) 

我测试,它看起来只有精细。我想你会需要一些形态学操作来获得最终结果。

+0

谢谢!由于这个菜鸟愚蠢的错误,我输了很多时间... – Delgan

+1

我使用HSV图像但得到奇怪的结果。如果你有一些时间,你可以看看它[这里](http://stackoverflow.com/questions/34170856/trying-to-detect-blue-color-from-image-using-opencv-and-getting-unexpected -resu)? – Solace