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
什么是(2,2)
? findContours()
的第四个位置参数是输出 contours
数组。但是您没有将 contours
数组(这是一个点数组)的有效格式传递给它。如果它应该是 offset
而你不想提供额外的位置参数,你需要通过 offset=(2,2)
这样的关键字来调用它。这就是实际错误的原因。我不确定为什么这在以前的版本中有效,因为它以相同的顺序接受相同的参数,并且 Python 一直都是这样;如果参数是可选的,您需要提供足够的位置参数直到参数,或者为其提供关键字。
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 语法,因此如果您之前的任何其他代码中断,您可以浏览那里,查看语法是否已更改。
我今天重装了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
什么是
(2,2)
?findContours()
的第四个位置参数是输出contours
数组。但是您没有将contours
数组(这是一个点数组)的有效格式传递给它。如果它应该是offset
而你不想提供额外的位置参数,你需要通过offset=(2,2)
这样的关键字来调用它。这就是实际错误的原因。我不确定为什么这在以前的版本中有效,因为它以相同的顺序接受相同的参数,并且 Python 一直都是这样;如果参数是可选的,您需要提供足够的位置参数直到参数,或者为其提供关键字。findContours()
returns OpenCV 3中的三个值(在OpenCV 2中它只是两个值),contours
是第二个return价值;应该是_, contours, _ = findContours(...)
也不必在python中包成
来请求第二个 return 值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 语法,因此如果您之前的任何其他代码中断,您可以浏览那里,查看语法是否已更改。