Python 如何在opencv 4.4.0版上正确使用cv2.FindOnTours()。?

Python 如何在opencv 4.4.0版上正确使用cv2.FindOnTours()。?,python,opencv,Python,Opencv,我正在尝试在opencv 4.4.0版上使用cv2.findOnTours()。(我使用的是Python版本3.8.5),但它抛出了一个错误,我想不出来。我不确定代码出了什么问题。以下是一些背景: 根据OpenCV,cv2.findContours()的语法如下: 蟒蛇: 轮廓,层次=cv.findContours(图像,模式,方法[,轮廓[,层次[,偏移]]) 我寻找了一些示例,以确保如何正确地实现它,以下是我的发现: 例1 _,等高线,\=cv2.findContours(二进制图像,c

我正在尝试在opencv 4.4.0版上使用cv2.findOnTours()。(我使用的是Python版本3.8.5),但它抛出了一个错误,我想不出来。我不确定代码出了什么问题。以下是一些背景:

  • 根据OpenCV,cv2.findContours()的语法如下: 蟒蛇: 轮廓,层次=cv.findContours(图像,模式,方法[,轮廓[,层次[,偏移]])

  • 我寻找了一些示例,以确保如何正确地实现它,以下是我的发现: 例1 _,等高线,\=cv2.findContours(二进制图像,cv2.RETR\u列表,cv2.CHAIN\u近似值,简单值)

例2 (u,cnts,u)=cv2.findContours(threshold.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

这些都是我在网上找到的工作项目,有很多这样的例子。因此,我试图实现一些代码,我从一个视频中获得一些关于这个主题的理解,但它似乎不适合我,我找不到原因。代码如下:

import cv2 
import numpy as np 

imagen =cv2.imread('lettuce.jpg')
gray = cv2.cvtColor(imagen,cv2.COLOR_BGR2GRAY)
_,binary = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)

image,contours,hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(image,contours, -1, (0,255,0),3)
错误: 回溯(最近一次呼叫最后一次): 第8行,在 图像、轮廓、层次=cv2.findContours(二进制、cv2.RETR\u列表、cv2.CHAIN\u近似值\u简单)
ValueError:没有足够的值来解包(预期3个,得到2个)

在Python/OpenCV 4.4.0中,FindOntours只返回2个值,您可以列出3个

你展示:

image,contours,hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

OpenCV 4.4.0,列出:

contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

请务必检查文档。看

如果您只想得到轮廓,那么以独立于版本的方式处理此问题的一种方法是(归功于@Nathance):



如果您不想要所有嵌套轮廓,请使用RETR_EXTERNAL而不是RETR_LIST。

在Python/OpenCV 4.4.0中,findContours只返回2个值,您可以列出3个值

你展示:

image,contours,hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

OpenCV 4.4.0,列出:

contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

请务必检查文档。看

如果您只想得到轮廓,那么以独立于版本的方式处理此问题的一种方法是(归功于@Nathance):



如果不需要所有嵌套轮廓,请使用RETR_EXTERNAL而不是RETR_LIST。

问题在于cv2.findContour函数将返回两个而不是三个

  • 轮廓
  • 等级制度
  • 此cv2.findContours函数接受三个输入参数。第一个参数是应为灰度图像的图像。第二种是检索模式,第三种是近似模式。当我们应用
    findContours
    方法时,原始图像将受到影响。最佳做法是在处理
    findContours
    方法之前复制图像

    OpenCV将等高线存储在列表的列表中。每个列表表示不同的轮廓。在列表中,该等高线的所有坐标都将添加到该列表中。 我们可以以不同的方式存储这些坐标。我们如何储存这些?
    近似模式开始发挥作用

    使用
    cv2.CHAIN\u APPROX\u NONE
    存储所有边界点。但我们不一定需要所有的边界点。如果这些点形成一条直线,我们只需要该直线的起点和终点。相反,使用
    cv2.CHAIN_APPROX_SIMPLE
    只提供边界轮廓的这些起点和终点,从而更有效地存储轮廓信息

    什么是检索模式?检索模式本质上定义了轮廓的层次结构,就像您想要子轮廓、外部轮廓还是所有轮廓一样

    在OpenCV的检索模式中有四种类型

    • cv2.RETR_列表→ 检索所有等高线
    • cv2.RETR_外部→ 仅检索外部或外部轮廓
    • cv2.RETR_公司→ 检索2级层次结构中的所有
    • cv2.RETR_树→ 检索完整层次结构中的所有

    层次结构以以下格式存储[下一个、上一个、第一个子、父]。

    问题在于cv2.findContour函数将返回两个而不是三个

  • 轮廓
  • 等级制度
  • 此cv2.findContours函数接受三个输入参数。第一个参数是应为灰度图像的图像。第二种是检索模式,第三种是近似模式。当我们应用
    findContours
    方法时,原始图像将受到影响。最佳做法是在处理
    findContours
    方法之前复制图像

    OpenCV将等高线存储在列表的列表中。每个列表表示不同的轮廓。在列表中,该等高线的所有坐标都将添加到该列表中。 我们可以以不同的方式存储这些坐标。我们如何储存这些?
    近似模式开始发挥作用

    使用
    cv2.CHAIN\u APPROX\u NONE
    存储所有边界点。但我们不一定需要所有的边界点。如果这些点形成一条直线,我们只需要该直线的起点和终点。相反,使用
    cv2.CHAIN_APPROX_SIMPLE
    只提供边界轮廓的这些起点和终点,从而更有效地存储轮廓信息

    什么是检索模式?检索模式本质上定义了轮廓的层次结构,就像您想要子轮廓、外部轮廓还是所有轮廓一样

    在OpenCV的检索模式中有四种类型

    • cv2.RETR_列表→ 检索所有等高线
    • cv2.RETR_外部→ 仅检索外部或外部轮廓
    • cv2.RETR_公司→ 检索2级层次结构中的所有
    • cv2.RETR_树→ 检索完整层次结构中的所有

    层次结构以以下格式存储[下一个、上一个、第一个子、父]。

    请参阅下面的我的答案。在OpenCV 4.4.0中,findContours只返回两个参数:轮廓和层次。@fmw42,你能解决这个问题吗?我已经发布了一个解决方案。请参阅下面我的答案。在OpenCV 4.4.0中,findContours只返回两个参数:轮廓和层次。@fmw42,你能解决这个问题吗