Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV findContour()返回的轮廓太多(Python)_Python_Opencv - Fatal编程技术网

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

OpenCV findContour()返回的轮廓太多(Python),python,opencv,Python,Opencv,我的简历有问题。我正在这里输入这张图片 然而,输出稍大,并创建了一些空间的轮廓,而这些空间不是图片的一部分。下面是输出的样子 如您所见,左侧和底部的面积增加,轮廓线以绿色绘制。我正在学习本教程,但是看了本教程和一些文档后,我并没有很清楚这是一个什么样的问题。这是我的代码 鉴于我们看到的是原始图片外的绿线,我猜cv.findContours正在发生一些事情,它正在拾取其他可能的外部轮廓线,并认为原始图片中的黑色轮廓是内部轮廓线,尽管这不能解释为什么它只发生在一半的侧面 import cv2 as

我的简历有问题。我正在这里输入这张图片

然而,输出稍大,并创建了一些空间的轮廓,而这些空间不是图片的一部分。下面是输出的样子

如您所见,左侧和底部的面积增加,轮廓线以绿色绘制。我正在学习本教程,但是看了本教程和一些文档后,我并没有很清楚这是一个什么样的问题。这是我的代码

鉴于我们看到的是原始图片外的绿线,我猜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()
您可以使用RETR_EXTERNAL而不是RETR_TREE仅返回外部轮廓,如下所示:

使用RETR_外部:

使用RETR_树:

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

使用RETR_外部:

使用RETR_树:


我最近也遇到了同样的问题,我找到的唯一解决方案是使用层次过滤获得的轮廓。当然,这是一个糟糕的解决方案,但它对我有效

在你的情况下,你应该只预测两个可能的问题

在结果层次结构中有这样的区域。您可以肯定地说,它们里面没有任何东西,所以只需忽略没有嵌套子对象的第一级轮廓即可

提升的整个图像可能嵌套到一个或多个轮廓中。那么,使用层次结构提取它就不是问题了

总之,我宁愿写几行代码来检查这个选项,然后深入opencv的内心


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

我最近也遇到了同样的问题,我找到的唯一解决方案是使用层次过滤获得的轮廓。当然,这是一个糟糕的解决方案,但它对我有效

在你的情况下,你应该只预测两个可能的问题

在结果层次结构中有这样的区域。您可以肯定地说,它们里面没有任何东西,所以只需忽略没有嵌套子对象的第一级轮廓即可

提升的整个图像可能嵌套到一个或多个轮廓中。那么,使用层次结构提取它就不是问题了

总之,我宁愿写几行代码来检查这个选项,然后深入opencv的内心


我想,关于等高线层次结构的最佳教程是

使用cv::RETR_EXTERNAL而不是cv.RETR_Tree你认为这会有帮助的理由是什么?顺便说一句,它没有改变任何东西检查我的答案,你会看到区别。使用cv::RETR\u EXTERNAL而不是cv.RETR\u Tree你认为这会有帮助的理由是什么?顺便说一句,它没有改变任何事情检查我的答案,你会看到区别。我不认为OP是在寻找答案。不是我在寻找的,除非有一种方法可以使用RETR_EXTERNAL使用它额外过滤掉最左下角的90度等高线-我扭曲出了不应该在输出中的区域picture@EvanKim现在你有两个轮廓,你可以只需通过OpenCV的boundingRect返回的宽度和高度过滤您不需要的宽度和高度。@BahramdunAdil我怎么知道输入哪个宽度和高度用作boundingRect的过滤器?当我使用不同大小的图片时,宽度和高度会发生变化。我不认为OP在寻找答案。不是我所寻找的,除非有一种方法可以使用RETR_EXTERNAL额外过滤掉最左下角的90度等高线-我扭曲出了不应该在输出中的区域picture@EvanKim现在您有两个轮廓,只需通过宽度和高度过滤您不需要的轮廓,该值通过OpenCV的boundingRect返回。@BahramdunAdil我如何知道输入哪个宽度和高度用作boundingRect的过滤器?当我使用不同大小的图片时,宽度和高度会发生变化。如果API已经提供了图片,那么就不用自己动手了。RETR_EXTERNAL会按照OP的要求进行操作,因此无需对RETR_TREE返回的大量轮廓进行额外检查,这会导致开销问题,特别是在实时使用时。@Smooth啊,好的,这是有道理的。我最初想从轮廓层次开始,然后我意识到最好从轮廓教程的开头开始:我计划完成整个系列。这让我更好地了解了结果层次结构在未来的用途。如果API已经提供了结果层次结构,请避免自己动手,外部的RETR_会按照OP的要求进行操作,因此无需对如此多的轮廓进行额外检查
按RETR_树旋转会导致开销问题,特别是在实时使用时。@Smooth啊,好的,这很有意义。我最初想从轮廓层次开始,然后我意识到最好从轮廓教程的开头开始:我计划完成整个系列。这使我更好地了解了结果层次结构在未来的用途