详细解释contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
时间: 2023-08-13 19:36:24 浏览: 114
`cv2.findContours()` 是 OpenCV 中的一个函数,用于在二值图像中查找轮廓。它返回两个值:轮廓列表 `contours` 和层级结构 `hierarchy`。
其中,`edges` 是一个二值图像(一般经过阈值处理得到),`cv2.RETR_EXTERNAL` 表示只检测外轮廓,`cv2.CHAIN_APPROX_SIMPLE` 表示轮廓的存储方式,只保留轮廓的端点。
`contours` 是一个 Python 列表,其中每个元素都是一个轮廓,每个轮廓都是一组表示物体边界的点的数组。每个点都是二维元组 `(x,y)`,表示轮廓上的坐标。
`hierarchy` 是一个包含每个轮廓的层级结构的数组。层级结构描述了轮廓之间的关系,例如哪些轮廓包含哪些轮廓,哪些轮廓是同级的等等。层级结构是一个四元组 `(next, prev, child, parent)`,其中 `next` 是下一个轮廓,`prev` 是前一个轮廓,`child` 是第一个子轮廓,`parent` 是父轮廓。如果没有子轮廓、前一个轮廓或者父轮廓,则对应的值为 -1。
通过使用 `cv2.findContours()` 函数,我们可以方便地获取图像中的轮廓及其层级结构,并对其进行分析和处理。
相关问题
cv2.findContours()的参数、返回值、用法
`cv2.findContours()` 是 OpenCV 的一个函数,它用于在图像中查找轮廓。该函数需要两个主要参数:输入图像和需要搜索轮廓的层次结构。此外,还可以使用其他参数来调整搜索过程。
函数的参数如下:
1. image:输入的图像,应该是一个二值图像,轮廓在该图像中可见。
2. hierarchy:一个层次结构对象,用于存储找到的轮廓及其之间的关系。如果未提供层次结构,则函数将创建一个新的空对象。
3. mode:搜索模式,可以是 `cv2.RETR_EXTERNAL`(只搜索最外层的轮廓)或 `cv2.RETR_LIST`(搜索所有层次的轮廓)。
4. method:轮廓搜索方法,可以是 `cv2.CHAIN_APPROX_SIMPLE`(每个轮廓由一串简单的链码表示)或 `cv2.CHAIN_APPROX_NONE`(每个轮廓由原始点云表示)。
返回值是一个轮廓列表,表示在输入图像中查找的所有轮廓。
以下是一个使用 `cv2.findContours()` 的基本示例:
```python
import cv2
import numpy as np
# 加载图像
image = cv2.imread('image.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny边缘检测算法找到边缘
edges = cv2.Canny(gray, 50, 150)
# 创建二值图像,将边缘与背景区分开
_, binary = cv2.threshold(edges, 50, 255, cv2.THRESH_BINARY)
# 在二值图像中查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 在原始图像上绘制找到的轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
# 显示图像
cv2.imshow('Image with contours', image)
cv2.waitKey(0)
```
这段代码首先加载一个图像并将其转换为灰度图像。然后,它使用Canny边缘检测算法找到边缘,并将边缘与背景区分开,以创建二值图像。在二值图像中,使用 `cv2.findContours()` 查找轮廓,并在原始图像上绘制这些轮廓。最后,显示包含轮廓的图像。
import cv2 import glob import numpy as np imgs = glob.glob("maze.png") res, L, N = [], 256, 5 for i in imgs: img = cv2.imread(i) img = cv2.resize(img, (512, 512)) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) max_contour = max(contours, key=cv2.contourArea) epsilon = 0.1 * cv2.arcLength(max_contour, True) approx = cv2.approxPolyDP(max_contour, epsilon, True) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=15, minRadius=5, maxRadius=15) if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(img, (x, y), r, (0, 0, 255), 2) # edges = cv2.Canny(gray, 100, 200) contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: center, (width, height), angle = cv2.minAreaRect(contour) if -5 <= (width - height) <= 5 and 30 <= width <= 50: cv2.drawContours(img, [contour], -1, (0, 0, 255), 3) res.append(cv2.resize(img, (L, L))) resImg = np.zeros((L * N, L * N, 3), dtype=np.uint8) for i, img in enumerate(res): row, col = i // N, i % N x, y = col * L, row * L resImg[y:y + L, x:x + L] = img cv2.imshow("", resImg) cv2.waitKey(0) cv2.destroyAllWindows()
这是一段Python代码,主要的作用是对给定的maze.png图片进行处理并展示处理后的结果。具体包括以下步骤:
1. 导入cv2、glob和numpy模块。
2. 使用glob模块获取maze.png图片的路径,将其读取并调整大小为512x512。
3. 将图片转化为灰度图,并进行二值化处理。
4. 使用cv2.findContours函数找到图像中的所有轮廓,并选择面积最大的轮廓进行逼近处理。
5. 使用cv2.HoughCircles函数检测图像中的圆形,并在圆形周围画出红色圆圈。
6. 使用cv2.Canny函数进行边缘检测,再次使用cv2.findContours函数找到图像中的所有轮廓。
7. 对于每个轮廓,使用cv2.minAreaRect函数获取其最小外接矩形,并判断其长宽比是否在一定范围内,如果满足条件,则在轮廓周围画出红色矩形。
8. 将处理后的图片添加进一个列表中,并将所有图片通过numpy模块拼接成一个大图展示。
以上就是这段代码的大致执行过程。
阅读全文