cv2.drawContours参数及其意义
时间: 2023-10-28 14:45:29 浏览: 222
cv2.drawContours是OpenCV中的一个函数,用于在图像上绘制轮廓。它具有以下参数:
- image:需要绘制轮廓的图像
- contours:要绘制的轮廓列表,每个轮廓都是一系列点的列表
- contourIdx:指定要绘制的轮廓的索引,如果为负数,则绘制所有轮廓
- color:轮廓的颜色
- thickness:轮廓的线条宽度
- lineType:线条类型,可选参数包括cv2.LINE_4(4邻域连接线条)和cv2.LINE_8(8邻域连接线条)
- hierarchy:轮廓的层次结构,用于指示轮廓之间的父子关系
相关问题
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()` 查找轮廓,并在原始图像上绘制这些轮廓。最后,显示包含轮廓的图像。
AttributeError:module 'cv2' has no attribute 'SNAKE_ELASTIC_NET'
抱歉,上面的代码在 OpenCV 3.4.2 版本及以下中是可行的,但在更高版本的 OpenCV 中可能会出现 'cv2' 没有属性 'SNAKE_ELASTIC_NET' 的错误。
为了解决这个问题,你可以使用 cv2.snake_image() 函数替换 cv2.cv.SnakeImage() 函数,并将模式参数 'SNAKE_ELASTIC_NET' 替换为 0。同时,你还需要将轮廓控制点的类型从 contours[0] 更改为 contours[0][:, 0, :]。
下面是修改后的代码示例:
```python
import cv2
# 读取图像
img = cv2.imread('lena.jpg')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, 50, 150)
# 寻找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 获取轮廓控制点
points = contours[0][:, 0, :]
# 设置参数
alpha = 0.1
beta = 0.1
gamma = 0.1
kappa = 2.0
iterations = 200
mode = 0
p = cv2.TERM_CRITERIA_ITER | cv2.TERM_CRITERIA_EPS
criteria = (p, iterations, 0.1)
# 进行轮廓优化
cv2.snake_image(points, alpha, beta, gamma, kappa, mode, criteria, 0)
# 画出轮廓线
cv2.drawContours(img, [points], -1, (0, 0, 255), 2)
# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
```
这个例子和之前的例子非常相似,主要区别在于使用 cv2.snake_image() 函数替换 cv2.cv.SnakeImage() 函数,并将模式参数 'SNAKE_ELASTIC_NET' 替换为 0。同时,我们将轮廓控制点的类型从 contours[0] 更改为 contours[0][:, 0, :]。
阅读全文