OpenCV findContour()返回的轮廓太多(Python)
我的简历有问题。我正在这里输入这张图片 然而,输出稍大,并创建了一些空间的轮廓,而这些空间不是图片的一部分。下面是输出的样子 如您所见,左侧和底部的面积增加,轮廓线以绿色绘制。我正在学习本教程,但是看了本教程和一些文档后,我并没有很清楚这是一个什么样的问题。这是我的代码 鉴于我们看到的是原始图片外的绿线,我猜cv.findContours正在发生一些事情,它正在拾取其他可能的外部轮廓线,并认为原始图片中的黑色轮廓是内部轮廓线,尽管这不能解释为什么它只发生在一半的侧面OpenCV findContour()返回的轮廓太多(Python),python,opencv,Python,Opencv,我的简历有问题。我正在这里输入这张图片 然而,输出稍大,并创建了一些空间的轮廓,而这些空间不是图片的一部分。下面是输出的样子 如您所见,左侧和底部的面积增加,轮廓线以绿色绘制。我正在学习本教程,但是看了本教程和一些文档后,我并没有很清楚这是一个什么样的问题。这是我的代码 鉴于我们看到的是原始图片外的绿线,我猜cv.findContours正在发生一些事情,它正在拾取其他可能的外部轮廓线,并认为原始图片中的黑色轮廓是内部轮廓线,尽管这不能解释为什么它只发生在一半的侧面 import cv2 as
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啊,好的,这很有意义。我最初想从轮廓层次开始,然后我意识到最好从轮廓教程的开头开始:我计划完成整个系列。这使我更好地了解了结果层次结构在未来的用途