为什么在一个代码中cv2.findContours函数起作用,而在另一代码中却不起作用?

时间:2019-05-09 17:57:17

标签: python opencv computer-vision image-thresholding

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

工作代码段:

    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)

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

我面临的错误是:

  

回溯(最近一次通话最后一次):文件“ convexhull.py”,第27行,在          im2,轮廓,层次结构= cv2.findContours(阈值,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)ValueError:没有足够的值要解压   (预计3,得到2)

让我知道是否还需要其他信息。

1 个答案:

答案 0 :(得分:1)

这是由于openCV发生了变化。从版本findContours开始,仅返回2个值:轮廓和层次结构。以前,在3.x版中,它返回3个值。您可以使用documentation来比较不同的版本。

当您将代码更改为:

时,第二个代码段应该起作用。
# find contours
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

从给出的信息中无法确定为什么第一个代码片段选择了不同的openCV版本。