0

我今天重新安装了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 行 Traceback(最近一次调用最后一次):文件“pokedex.py”,第 12 行,in (cnts, _) = cv2.findContours(gray, 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

4

1 回答 1

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

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

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

    此外,您不必tuple在 python 中包装到 a 中进行分配,您可以只做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]

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

于 2017-09-28T06:30:57.320 回答