当前位置: 首页 > 知识库问答 >
问题:

为什么在一个代码中cv2.findContour函数工作,但在另一个代码中不工作?

宇文育
2023-03-14

我是计算机视觉新手,还没有真正学习过阈值、模糊或其他过滤器教程。我使用下面两段代码找出图像中的轮廓。一方面,这种方法是有效的,但另一方面,它不是。我需要帮助理解发生这种情况的原因,以便说服自己背景中发生了什么。

工作代码段:

    img=cv2.imread('path.jpg')
    imgBlurred = cv2.GaussianBlur(img, (5, 5), 0)
    gray = cv2.cvtColor(imgBlurred, cv2.COLOR_BGR2GRAY)

    sobelx = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
    cv2.imshow("Sobel",sobelx)
    cv2.waitKey(0)
    ret2, threshold_img = cv2.threshold(sobelx, 120, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)


    im2, contours, hierarchy = cv2.findContours(threshold_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

不工作的代码段

# read image
    src = cv2.imread(file_path, 1)

    # show source image
    cv2.imshow("Source", src)

    # convert image to gray scale
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    # blur the image
    blur = cv2.blur(gray, (3, 3))

    # binary thresholding of the image
    ret, thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)

    # find contours
    im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

如果有人能找出这里发生的错误的原因,我将不胜感激。

我所面对的错误是:

回溯(最近一次调用last):文件“convexhull.py”,第27行,在im2中,等高线,层次结构=cv2。findContours(thresh,cv2.RETR_树,cv2.CHAIN_近似值_简单)值错误:没有足够的值来解包(预期为3,获得2)

如果还需要任何其他信息,请告诉我。

共有1个答案

冀望
2023-03-14

这是由于openCV中的更改。由于版本4.0findContours只返回两个值:轮廓和层次。之前,在版本3中。x、 它返回3个值。您可以使用文档来比较不同的版本。

当您将代码更改为:

# find contours
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

第一个代码段选择不同openCV版本的原因无法从给出的信息中确定。

 类似资料:
  • 我有以下Sikuli代码在JMeter这是不工作。 我尝试了Beanshell采样器和JSR223采样器,但在这两种情况下都不起作用。这是我得到的错误。 JSR223采样器 响应消息:javax。剧本脚本异常:javax。剧本ScriptException:FindFailed:C:\scripts\patterns\vnc\vncviewer。png:(32x31)在R[0,0 1920x108

  • 我一直在尝试创建一个功能类似图书馆系统的web应用程序,目前我正在构建一个将显示系统中所有书籍的表。但是,在我关闭第一个echo语句以开始用HTML构建表之后,应用程序似乎不再将其视为代码,而是将PHP代码的其余部分打印到屏幕上。 下面是所讨论的代码: 我显然对PHP不太精通,所以我不知道问题是什么。

  • 问题内容: 因此,我试图使用ctypes模块制作一个Python 3.3程序来更改Windows桌面背景。我已经在Python 2.7中测试了以下代码,并且运行良好。但这仅在Python 3.3中不起作用!我使用的是Windows7。代码如下: 问题答案: 需要一个8位ANSI编码的输入字符串作为参数,这在Python中被称为encoding 。 您将不得不在python3中使用。这是因为接受UT

  • 我正在尝试使用Cython来加速我的Python脚本的某些部分。一个关键部分将函数应用于Pandas数据框架;由于这已经完成了很多次,我想用Cython编写这些函数以加快计算速度。函数如下,并且在同一个Jupyter笔记本单元格中: 笔记本单元按编写的方式成功运行,因此我认为两个函数都编译成功。但是,此代码按预期运行: 鉴于本规范: 不运行,并返回"NameError: name'evenness

  • 我有两个include文件(fill_boxMain.php和fill_boxBottom.php)。这两个都包含在my index.php中,用于按顺序填充两个div的内容。 例如: 第一个(fill_boxMain.php)工作正常。无论我如何安排或更改代码,第二个都会失败,并且会出现相同的可重复错误。i、 e.mysqli_查询($dbc,$q)失败。 选择查询在phpMyAdmin中运行良

  • rank ▲ ✰ vote url 44 455 162 534 url 为什么代码在一个函数里运行的更快? def main(): for i in xrange(10**8): pass main() 在Python中运行速度: real 0m1.841s user 0m1.828s sys 0m0.012s 然而不把它放在函数里: for i