查找轮廓函数中的 opencv ValueError - 其他解决方案无效

opencv ValueError in find contour function - other solutions didn't work

我一直在使用 here 的 Python 小程序。 这一直很好用,直到最近我不得不擦除并重新安装我的 RaspberryPi,现在在重新安装包括 Python 和 opencv 在内的所有内容之后,我似乎有一些向后兼容性问题,代码中的以下行失败并抛出错误下面:

代码

thresh = cv2.dilate(thresh, None, iterations=2)
(_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

这将扩大阈值图像以填充任何孔,然后在阈值图像上找到轮廓

错误

File "/home/pi/carspeed/carspeed.py", line 228, in <module>
    (_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
ValueError: not enough values to unpack (expected 3, got 2)

我尝试了在网上找到的不同方法,包括将行更改为此,但无济于事

(_, cnts, _) = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

(我在网上找到的答案是:

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

但由于原始代码设置的是(_, cnts, _)变量,我以为我别无选择,所以使用了相同的。)

您访问的存储库正在使用 OpenCV 3.x。但是,您使用的是 OpenCV 4.x。 findContours 的输出在 OpenCV 4

中发生了变化

OpenCV4缺少什么变量?

As stated in the documentation,OpenCV3 的 findContours 方法也用于 return 源图像本身,这在您的情况下也是不必要的。如果你想再次使用源图像,你可以创建一个新变量并调用 copy = img.copy.

Example findContours usage for OpenCV3.x

Example findContours usage for OpenCV4.x

已解决 - 最新版opencv的新代码应该是这样的:

(cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)