2017-03-16 514 views
0

我正在研究一个物体检测和跟踪系统,输入是一个rgb网络摄像头流。我的代码没有问题来检测黄色,绿色和蓝色的几何物体,如球,但是当谈到红球时,我正在挑战一个问题。OpenCV + python红球检测和跟踪

# converting the input stream into HSV color space 
hsv_conv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

# because hue wraps up and to extract as many "red objects" as possible, I define lower and upper boundaries for brighter and for darker red shades 
bright_red_lower_bounds = (0, 100, 100) 
bright_red_upper_bounds = (10, 255, 255) 
bright_red_mask = cv2.inRange(hsv_conv_img, bright_red_lower_bounds, bright_red_upper_bounds) 

dark_red_lower_bounds = (160, 100, 100) 
dark_red_upper_bounds = (179, 255, 255) 
dark_red_mask = cv2.inRange(hsv_conv_img, dark_red_lower_bounds, dark_red_upper_bounds) 

# after masking the red shades out, I add the two images 
weighted_mask = cv2.addWeighted(bright_red_mask, 1.0, dark_red_mask, 1.0, 0.0) 

# then the result is blurred 
blurred_mask = cv2.GaussianBlur(weighted_mask,(9,9),3,3) 

# some morphological operations (closing) to remove small blobs 
erode_element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
dilate_element = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8)) 
eroded_mask = cv2.erode(blurred_mask,erode_element) 
dilated_mask = cv2.dilate(eroded_mask,dilate_element) 

# on the color-masked, blurred and morphed image I apply the cv2.HoughCircles-method to detect circle-shaped objects 
detected_circles = cv2.HoughCircles(dilated_mask, cv2.HOUGH_GRADIENT, 1, 150, param1=100, param2=20, minRadius=20, maxRadius=200) 
if detected_circles is not None: 
    for circle in detected_circles[0, :]: 
     circled_orig = cv2.circle(frame, (circle[0], circle[1]), circle[2], (0,255,0),thickness=3) 
    cv2.imshow("original", circled_orig) 
else: 
    cv2.imshow("original", frame) 

问题:通过限定范围广泛的“红色”,从HSV提取,我的手和我的脸(在镜头前站立时,保持球)的部分被提取了。 后来HoughCircles方法检测到我手和脸上剩余区域的小圆圈。

我玩了一些cv2.HoughCircles的参数(不太容易调整),例如,一个小的param2值会比一个更大的值检测更多(错误)的圆圈。

有没有人有一个想法如何克服这个问题,并消除错误检测到的圈子?要求:系统对球的大小一无所知,它应该检测很多。所以我无法定义最小或最大圆半径以消除误报。

非常感谢提前。 问候, 克里斯

PS:这段代码是对this one

+1

提供图像将有所帮助。 – m3h0w

回答

0

密切为本因为你的脸和手带红色区域是 - 我希望 - 远远超过球少齐,尝试HSV之前模糊阈值。这应该软化红色区域,你不想检测它们,并在球上,颜色应该保持大致相同。

编辑: 如果在评论中提供的例子是任何接近真实情况,它证明了模糊能够解决您的问题。基本上你想要做的是创建多个轨道条并针对不同类型的模糊同时进行调整;形态学操作;和HSV阈值本身(因为模糊可能会改变阈值的最佳值)。通过实时查看检测到的区域来进行实验,这将有助于您找出哪些有帮助,哪些不会。

正如我的教授曾经说过的:“如果我们的眼睛能看到,电脑就能看到它”。这里就是这种情况 - 球的颜色与贝克汉姆的脸色非常不同。

+0

由于我不想发布自己的照片,我创建了一个示例,它很好地显示了什么问题https://cruzercloud.feste-ip.net/index.php/s/aq0lQvOfywj82Ao 正如你所看到的这个球并不是很好看,而且这个球是一个“阴影”的部分。 脸部的中间部分被错误地识别为一个圆圈。 在HSV阈值设置之前关于模糊图片的提示可以提高一点,但仍然存在虚假识别的圆圈。 –

+0

请使用imgur或其他可信任的提供商。 – m3h0w

+0

http://imgur.com/a/k6x23 –