我使用的是 openCV 2.4.9 版本,我所指的代码具有以下行:
im2,contours,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
我不断收到错误消息:“ValuesError:需要超过 2 个值才能解包” 我知道 2.4.9 版 openCV 中的 findContour 仅返回两个值。但这些值(value)观是什么?
最佳答案
在这个函数的三参数版本中,它返回额外的“im2”参数。我将简要介绍轮廓和层次结构返回,因为它们有据可查。这两个返回值取决于传入的两个常量。它们是下面的变体。
Contours 是一个列表,或点列表的树。这些点描述了每个轮廓,即一个矢量,可以根据它与背景的不同绘制为形状各部分周围的轮廓。
层次结构显示形状如何相互关联,层本身 - 如果形状彼此重叠,则可以在此处确定。
试验 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 的东西 - 但该二进制图像中只有一个 channel ,所以即使它有,我也不相信我能够看到它。您不能在其正常模式下将其应用于 32 位图像。我还发现在没有阈值处理的情况下,灰度图像没有明显差异。
关于python - opencv 2.4.9 中 findcontour 函数返回的值是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236061/