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

OpenCV Python:cv2.findContours返回许多轮廓,python,opencv,computer-vision,background-subtraction,Python,Opencv,Computer Vision,Background Subtraction,我正在使用一个小程序,它将使用OpenCV+python的背景减法来计算汽车数量。我对背景减法很在行,我已经有了背景图像。但是当我使用cv2.findContours(fgmask.copy()、cv2.RETR\u EXTERNAL、cv2.CHAIN\u APPROX\u SIMPLE)时,我得到的轮廓太多了。虽然我可以通过检查轮廓区域(cv2.contourArea(contour))进行一些基本过滤,如中所示,但并不是所有的车辆都被检测到 我还研究了cv2.grouprectanges(

我正在使用一个小程序,它将使用OpenCV+python的背景减法来计算汽车数量。我对背景减法很在行,我已经有了背景图像。但是当我使用
cv2.findContours(fgmask.copy()、cv2.RETR\u EXTERNAL、cv2.CHAIN\u APPROX\u SIMPLE)
时,我得到的轮廓太多了。虽然我可以通过检查轮廓区域(
cv2.contourArea(contour)
)进行一些基本过滤,如中所示,但并不是所有的车辆都被检测到

我还研究了
cv2.grouprectanges(rectList,minNum[,eps])
,但我似乎无法创建矩形向量(顺便说一下,这是在最后一个函数中)

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

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
是要绘制轮廓的最大和最小区域)

我的问题:如何对矩形进行分组或使用一些标准来绘制正确的矩形(并防止车辆被识别)


非常感谢您的帮助。

我已经理解了这个问题。您需要识别矩形(实际图像中的汽车)从图像。不考虑大小。MinareRect函数将在给定的所有轮廓上拟合最小面积矩形。这样,您无法识别矩形形状。但您可以将此最小矩形作为每个轮廓的模板,并将其与特定轮廓匹配。根据匹配分数,您可以决定是否匹配矩形与否。您可以尝试的另一种方法是。

一些示例图像可能会help@Miki那里应该有多少等高线?你可以计算Ccontoura面积,把轮廓放得太小3个轮廓。但是我怎么才能确定我没有掉下来的轮廓真的是一辆车呢?我需要在每个物体周围放一个盒子,在这个例子中,一辆车。问题是我在跟踪视频中的几个帧时,单个对象有多个框。如果发生这种情况,我无法使用轮廓来计算对象。我在使用canny边缘检测时遇到了多轮廓问题。然后,我只从该特定对象的多个轮廓中提取了父轮廓。如果遇到相同的问题,也可以使用相同的方法。如果检查该特定对象的层次结构contour。您可以找到它是否是父对象。请参阅此内容以更好地了解层次结构您是如何调用cv2.FindContour的?你用了哪些旗子?你甚至用过Python吗?是的,我用过Python。轮廓,层次=cv2.findContours(binaryImage,cv2.RETR\u TREE,cv2.CHAIN\u近似\u SIMPLE)