Python 如何在opencv 4.4.0版上正确使用cv2.FindOnTours()。?
我正在尝试在opencv 4.4.0版上使用cv2.findOnTours()。(我使用的是Python版本3.8.5),但它抛出了一个错误,我想不出来。我不确定代码出了什么问题。以下是一些背景: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,cv2.findContours()的语法如下: 蟒蛇: 轮廓,层次=cv.findContours(图像,模式,方法[,轮廓[,层次[,偏移]])
- 我寻找了一些示例,以确保如何正确地实现它,以下是我的发现: 例1 _,等高线,\=cv2.findContours(二进制图像,cv2.RETR\u列表,cv2.CHAIN\u近似值,简单值)
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函数将返回两个而不是三个
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,你能解决这个问题吗