首页 文章

OpenCV3.3.0 findContours错误

提问于
浏览
0

我今天重新安装了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行追溯(最近一次调用最后一次):文件“pokedex.py”,第12行,在(cnts,)= cv2.findContours(灰色,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 回答

  • 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语法,因此如果您的其他任何先前代码中断,您可以浏览它,并查看语法是否已更改 .

相关问题