opencv 2.4.9中findcontour函数返回的值是什么

2024-10-06 15:20:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是openCV 2.4.9版本,我所指的代码如下: im2,contours,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

我一直得到错误:“valuesRor:需要超过2个值才能解包” 我知道2.4.9版本的openCV中的findContour只返回两个值。但这些价值观是什么?


Tags: 代码版本chaincv2opencvexternalcopyim
2条回答

OpenCV文档包含返回类型的所有详细信息。也许你应该经历一次。See this了解层次结构。若要更正错误,请使用-

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

你现在使用的是OpenCV 3。

在这个函数的三参数版本中,它返回附加的“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)

形状和颜色是来自pyimagesearch的测试图像:

The original image

这将变为灰度来阈值:

Image converted to greyscale

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

enter image description here

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

enter image description here

没有明显的区别。也许一个复杂的图像差异算法可以找到一些我找不到的东西。我意识到这些是有损JPG的,这可能会混淆。 到目前为止,我看不出im2返回值有多大用处,但轮廓和层次结构绝对有用。

我会说,我本来希望看到类似于绘制轮廓的东西,但在二值图像中只有一个通道,所以即使它有,我也不相信我能看到它。在正常模式下,无法将其应用于32位图像。我也看到没有阈值的灰度图像没有明显的差异。

相关问题 更多 >