【问题标题】:OpenCV3.3.0 findContours errorOpenCV3.3.0 findContours错误
【发布时间】:2018-03-09 18:53:38
【问题描述】:

我今天重新安装了opencv,并运行了我之前编写的代码。 我得到了错误:

OpenCV 错误:findContours 中的断言失败 (_contours.empty() || (_contours.channels() == 2 && _contours.depth() == CV_32S)),文件 /tmp/opencv-20170916-87764-1y5vj25 /opencv-3.3.0/modules/imgproc/src/contours.cpp,第 1894 行 回溯(最近一次通话最后): 文件“pokedex.py”,第 12 行,在 (cnts, _) = cv2.findContours(灰色, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, (2,2)) cv2.error:/tmp/opencv-20170916-87764-1y5vj25/opencv-3.3.0/modules/imgproc/src/contours.cpp:1894:错误:(-215)_contours.empty()|| (_contours.channels() == 2 &&_contours.depth() == CV_32S) 在函数 findContours

代码在 opencv2.4.13.3 上运行良好。

代码:

image = cv2.imread("test.jpg")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    // `len(gray.shape)` is 2.

(cnts, _) = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, (2,2))

版本信息:opencv 3.3.0、python 2.7.13、macOS 10.13

【问题讨论】:

    标签: python opencv opencv3.3


    【解决方案1】:
    1. 什么是(2,2)findContours() 的第四个位置参数是输出 contours 数组。但是您没有将contours 数组(它是一个点数组)的有效格式传递给它。如果它应该是 offset 并且您不想提供额外的位置参数,则需要使用 offset=(2,2) 之类的关键字来调用它。这就是实际错误的原因。我不确定为什么这在以前的版本中有效,因为它以相同的顺序接受相同的参数,而 Python 一直都是这样;如果参数是可选的,则需要提供足够多的位置参数,或者提供一个关键字。

    2. findContours() 在 OpenCV 3 中返回三个值(在 OpenCV 2 中只有两个值),contours 是第二个返回值;应该是

      _, contours, _ = findContours(...) 
      

      另外,你不必在 python 中包装成 tuple 进行赋值,你可以只做 x, y, z = fun(),不需要做 (x, y, z) = fun()。此外,您可以通过索引结果来请求第二个返回值,例如

      contours = cv2.findContours(...)[1]
      

    所以这应该让你明白:

    cnts = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, offset=(2,2))[1]
    

    These docs for OpenCV 3 具有 Python 语法,因此如果您之前的任何其他代码中断,您可以在那里浏览,并查看语法是否已更改。

    【讨论】:

    • 谢谢,我发现findContours()的语法变了。
    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2019-01-12
    • 1970-01-01
    • 2012-04-29
    • 2016-06-25
    相关资源
    最近更新 更多