我使用的是openCV 2.4.9版本,我所指的代码有以下几行:
im2,contours,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
我一直收到错误:" ValuesError:需要2个以上的值来解包#34; 据我所知,openCV的2.4.9版本中的findContour只返回两个值。但这些价值观是什么?
答案 0 :(得分:1)
OpenCV文档包含返回类型的所有详细信息。也许你应该经历过那一次。 See this了解层次结构。要更正错误,请使用 -
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
您目前使用的是OpenCV 3。
答案 1 :(得分:1)
在此函数的三个参数版本中,它返回附加的“ 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的测试图像:
将其变为灰度以对其进行阈值处理:
然后我应用阈值以获取二进制图像:
最后,我运行findcontours-并将“ im2”参数写入图像:
没有明显的区别。也许复杂的图像差异算法可以找到我找不到的东西。我意识到这些是有损的JPG,可能会混淆这一点。 到目前为止,我还看不到im2返回值有很多用途,但是轮廓和层次结构绝对有用。
我要说的是,我希望会看到类似drawcontours的东西-但是二进制图像中只有一个通道,所以即使有,我也不相信我能够看到它。在正常模式下,您无法将其应用于32位图像。在没有阈值的情况下,我也看不到灰度图像上的可见差异。