OpenCV findContour()返回太多轮廓(Python)

时间:2019-02-18 13:16:11

标签: python opencv

我遇到CV.drawContours问题。我在这里输入这张图片。

enter image description here

但是,输出会稍大一些,并会创建一些不属于图片的空间的轮廓。这是输出的样子 enter image description here

如您所见,沿着左侧和底部增加了面积,并绘制了轮廓线(绿色)。我正在关注本教程on OpenCV Contours,但是同时查看本教程和一些文档并不能使我很清楚这是什么问题。这是我的代码。

鉴于我们看到的是原始图片之外的绿线,我猜cv.findContours发生了一些变化,并且它正在拾取其他可能的外部轮廓线,并考虑了原始图片中的黑色轮廓图片是内部轮廓线(尽管这不能解释为什么仅在侧面的一半上发生)。

import cv2 as cv

# Find contours
im = cv.imread("binary_graph_8.png")
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# Draw countours
cv.drawContours(im, contours, -1, (0, 255, 0), thickness=1)

#Issue - function shows more than 100% of entire image...2/17/2019
cv.imshow("window title", im)
cv.waitKey()

2 个答案:

答案 0 :(得分:3)

您可以使用RETR_EXTERNAL代替RETR_TREE仅返回外部轮廓,如下所示:

使用RETR_EXTERNAL:

enter image description here

使用RETR_TREE:

enter image description here

答案 1 :(得分:1)

我最近在同一个问题上苦苦挣扎,发现的唯一解决方案是使用层次结构过滤获得的轮廓。当然,这是一种不好的解决方案,但对我有用。

在您的情况下,您应该仅预测两种可能的问题。

  1. 您在结果层次结构中具有此类区域。您可以肯定地说它们里面没有任何东西,因此只需忽略没有嵌套子级的第一级轮廓

  2. 您宣传的整个图像可能会嵌套成一个轮廓。然后使用层次结构将其提取出来不是问题。

总而言之,我宁愿编写几行代码来检查此选项,然后深入了解opencv的胆量。

我想,关于轮廓的层次结构的最佳教程是there