OpenCV3.3.0 findContours报错

OpenCV3.3.0 findContours error

我今天重装了opencv,运行我以前写的代码。 我收到错误:

OpenCV Error: Assertion failed (_contours.empty() || (_contours.channels() == 2 && _contours.depth() == CV_32S)) in findContours, file /tmp/opencv-20170916-87764-1y5vj25/opencv-3.3.0/modules/imgproc/src/contours.cpp, line 1894 Traceback (most recent call last): File "pokedex.py", line 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: error: (-215) _contours.empty() || (_contours.channels() == 2 &&_contours.depth() == CV_32S) in function 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

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

  2. findContours() returns OpenCV 3中的三个值(在OpenCV 2中它只是两个值),contours是第二个return价值;应该是

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

    也不必在python中包成tuple赋值,直接x, y, z = fun()即可,不需要(x, y, z) = fun()。此外,您可以通过索引结果

    来请求第二个 return 值
    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 语法,因此如果您之前的任何其他代码中断,您可以浏览那里,查看语法是否已更改。