在OpenCV 2.4.9中,findcontour函数返回的值是什么?

3
我使用的是OpenCV 2.4.9版本,我参考的代码中有以下代码行: im2,contours,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 我一直收到错误信息:"ValuesError:需要超过2个值来解压缩" 我知道在OpenCV 2.4.9版本中的findContour只返回两个值,但这些值是什么?

为什么要两次使用 cv2.RETR_EXTERNAL - Jeru Luke
1
你能否添加一个最小、完整且可验证的示例,并阅读提问的智慧文章! - jhoepken
有人可以解释一下"im2"返回值是什么吗?我在任何文档中都没有看到这个信息。 - Danny Staple
2个回答

4
在这个函数的三参数版本中,它返回了额外的"im2"参数。轮廓和层次结构的返回值因为有很好的文档记录,所以我会简要介绍一下。两个返回值取决于传入的两个常量。它们是以下变体。
轮廓是一个点列表或树形结构的列表。这些点描述了每个轮廓,也就是可以根据形状与背景的差异绘制轮廓线的向量。
层次结构显示了形状之间的关系,就像图层一样——如果形状在彼此之上,则可以在这里确定。
尝试使用im2返回值进行实验 https://docs.opencv.org/3.3.1/d4/d73/tutorial_py_contours_begin.html上的文档建议im2是一个修改后的图像。我对这个返回值很感兴趣,因为文档并没有真正告诉我它的作用或用处。
实际实验表明没有任何区别。 我的代码:
import cv2

im = cv2.imread('shapes_and_colors.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.jpg", imgray)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
cv2.imwrite("thresh.jpg", thresh)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite("contour.jpg", im2)

Shapes and colors是来自pyimagesearch的测试图像:

原始图像

将其转换为灰度图像以进行阈值处理:

转换为灰度图像的图像

然后应用阈值,得到二进制图像:

输入图像描述

最后运行findcontours - 并只将“im2”参数写入图像:

输入图像描述

没有可见的差异。也许一个复杂的图像差异算法可以找到我找不到的东西。我意识到这些都是有损压缩的JPG,可能会使其更加混乱。到目前为止,我看不出im2返回值有什么作用,但轮廓和层次结构肯定是有用的。

我会说,我原本期望看到像drawcontours这样的东西 - 但那个二进制图像中只有一个通道,所以即使它有,我也不确定我能看到它。你不能在正常模式下将其应用于32位图像。我还看不出在没有阈值处理的灰度图像上应用它的可见差异。


2

OpenCV文档中有所有返回类型的详细信息。也许您应该仔细阅读一遍。通过查看此链接了解层次结构。要更正您的错误,请使用-

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

您当前使用的是针对OpenCV 3的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接