我今天重新安装了opencv,然后运行我以前编写过的代码。 我收到了错误:
OpenCV错误:断言失败(_contours.empty()||(_ contours.channels()== 2&& _contours.depth()== CV_32S))在findContours中,文件/ tmp / opencv-20170916- 87764-1y5vj25 / opencv-3.3.0 / modules / imgproc / src / contours.cpp,第1894行 Traceback(最近一次调用最后一次): 文件“pokedex.py”,第12行,in (cnts,_)= cv2.findContours(grey,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))
答案 0 :(得分:1)
什么是(2,2)
? findContours()
的第四个位置参数是输出contours
数组。但是你没有将它传递给contours
数组的有效格式(这是一个点数组)。如果它应该是offset
并且您不想提供额外的位置参数,则需要通过关键字offset=(2,2)
来调用它。这是实际错误的原因。我不确定为什么这在以前的版本中有效,因为它以相同的顺序接受相同的参数,而Python一直是这样的;如果参数是可选的,你需要提供足够的位置参数直到参数,或者为它提供一个关键字。
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语法,因此如果您的其他任何先前代码中断,您可以浏览它,并查看语法是否已更改。