我正在使用一个小程序,它将使用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)
(MINAREA
和MAXAREA
是绘制轮廓的最大和最小区域)
我的问题:如何对矩形进行分组或使用某些条件绘制正确的矩形(并防止汽车被识别)?
非常感谢任何帮助。
答案 0 :(得分:2)
我已经理解了这个问题。你需要从图像中识别矩形形状(实际图像中的汽车)。无论大小如何.minAreaRect函数将在给定的所有轮廓上拟合最小面积矩形。这种方式你不能识别矩形形状。但是你可以把这个最小的矩形作为每个轮廓的模板,并将它与特定的轮廓相匹配。根据匹配的分数,你可以决定它是否是矩形。更多的方法你可以尝试How to detect simple geometric shapes using OpenCV。