OpenCV + python红球检测和跟踪

时间:2017-03-16 17:07:33

标签: python opencv tracking object-detection

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

# 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的一小部分值会检测到比更大值更多(错误)的圆圈。

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

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

p.s。:这段代码与this one

密切相关

1 个答案:

答案 0 :(得分:0)

由于你脸上和手上的红色区域 - 我希望 - 比球更不均匀,在HSV阈值化之前尝试模糊。这应该会使你想要探测它们的红色区域变得柔和,并且在球上,颜色应该或多或少保持不变。

修改 如果您在评论中提供的示例与实际情况有关,则可以证明模糊可以解决您的问题。你想要做的基本上是创建多个轨道栏并同时调整它们以适应不同类型的模糊;形态学运作;和HSV阈值本身(因为模糊可能会改变阈值的最佳值)。通过对检测到的区域的实时视图进行试验,这可以帮助您找出有用的和无效的。

正如我的教授常说的那样:"如果我们的眼睛可以看到,电脑就能看到它"。这显然就是这种情况 - 球的颜色与贝克汉姆的颜色完全不同。