OpenCV3.3.0 findContours错误

时间:2017-09-28 06:17:39

标签: python opencv opencv3.3

我今天重新安装了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))

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

1 个答案:

答案 0 :(得分: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]
    
  3. 所以这应该让你清楚:

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

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