OpenCV Python:cv2.findContours返回许多轮廓

时间:2015-12-23 17:34:07

标签: python opencv computer-vision background-subtraction

我正在使用一个小程序,它将使用OpenCV + python的背景减法来计算汽车数量。我对背景减法很好,我已经有了背景图像。但是当我使用cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)时,我的轮廓太多了。虽然我可以通过检查轮廓区域(cv2.contourArea(contour))来进行一些基本过滤,如http://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/所示,并非所有车辆都被检测到。

我也看了cv2.groupRectangles(rectList, minNum[, eps]),但我似乎无法创建一个矩形向量(顺便说一下,这是http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html中的最后一个函数)。

我找到轮廓/绘制矩形的代码:

contours, im2 = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    if MAXAREA >= cv2.contourArea(cnt) >= MINAREA:
        rect = cv2.minAreaRect(cnt)
        points = cv2.cv.BoxPoints(rect)
        cv2.rectangle(img, (int(points[1][0]), int(points[1][1])), (int(points[3][0]), int(points[3][1])), (0, 255, 0), 2)

MINAREAMAXAREA是绘制轮廓的最大和最小区域)

我的问题:如何对矩形进行分组或使用某些条件绘制正确的矩形(并防止汽车被识别)?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我已经理解了这个问题。你需要从图像中识别矩形形状(实际图像中的汽车)。无论大小如何.minAreaRect函数将在给定的所有轮廓上拟合最小面积矩形。这种方式你不能识别矩形形状。但是你可以把这个最小的矩形作为每个轮廓的模板,并将它与特定的轮廓相匹配。根据匹配的分数,你可以决定它是否是矩形。更多的方法你可以尝试How to detect simple geometric shapes using OpenCV