OpenCV 例程200篇 总目录-202205更新
【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)
1. 轮廓
轮廓是一系列相连的像素点组成的曲线,代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。
边缘检测根据灰度的突变检测边界,但检测到的边缘通常还是零散的片段,并未构成整体。从背景中分离目标,就要将边缘像素连接构成轮廓。也就是说,轮廓是连续的,边缘不一定都连续。边缘主要是作为图像的特征使用,而轮廓主要用来分析物体的形态。
### 1.2 轮廓的绘制
OpenCV 提供函数 cv2.drawContours() 绘制轮廓。绘制轮廓并不是绘图显示,而是修改图像添加轮廓线。
函数说明:
cv.drawContours(image, contours, contourIdx, color[, thickness=1, lineType=LINE_8, hierarchy=Mat(), maxLevel=INT_MAX, offset=Point()] ) → image
cv.findContours() 对黑色背景的二值图像操作,通常会先使用阈值分割或边缘检测得到二值图像。
参数说明:
- image:输入/输出图像,必须是 BGR 格式的彩色图像
- contours: 输入的轮廓列表,每个轮廓由边界点坐标 (x,y) 向量构成
- contourIdx:所要绘制的轮廓的编号,-1 表示绘制所有轮廓
- color:绘制轮廓的颜色,RGB
- thickness:绘制轮廓的线宽,-1 (“CV_FILLED”)表示轮廓内部填充
- lineType:绘制轮廓的线型
- cv.FILLED:填充
- cv.LINE_4:4 邻接线型
- cv.LINE_8:8 邻接线型,默认值
- cv.LINE_AA:抗锯齿线型
- hierarchy: 轮廓的结构信息,可选项
- maxLevel:绘制轮廓的最大级别,存在轮廓结构信息 hierarchy 时才适用:0 表示仅绘制指定轮廓,1 表示绘制轮廓及下一级的子轮廓, 2 表示绘制轮廓及所有各级内部轮廓
- offset:每个轮廓点的偏移量,可选项
注意事项:
- 在一些 OpenCV 版本中,绘制轮廓操作会改变原始图像。为了避免不同版本带来的错误,推荐都采用原始图像的 copy 作为函数的输入图像。
例程 12.2:绘制轮廓
# 12.2 绘制轮廓img = cv2.imread("../images/pattern1.png", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY_INV)plt.figure(figsize=(9, 6))plt.subplot(131), plt.axis('off'), plt.title("Origin")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 寻找二值化图中的轮廓binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # OpenCV3# contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # OpenCV4~# 绘制最内层轮廓, hierarchy[0][i][2]=-1 表示没有子轮廓,即为最内层轮廓contourEx = img.copy() # OpenCV3.2 之前的早期版本,查找轮廓函数会修改原始图像for i in range(len(contours)): # 绘制第 i 个轮廓if hierarchy[0][i][2]==-1: # 最内层轮廓x, y, w, h = cv2.boundingRect(contours[i]) # 外接矩形text = "{}({},{})".format(i, x, y)contourEx = cv2.drawContours(contourEx, contours, i, (205, 0, 0), thickness=-1) # 第 i 个轮廓,内部填充contourEx = cv2.putText(contourEx, text, (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255))print("i=", i, ",contours[i]:", contours[i].shape, ",hierarchy[0][i] =", hierarchy[0][i], "text=", text)# 绘制全部轮廓,contourIdx=-1 绘制全部轮廓contourTree = img.copy()contourTree = cv2.drawContours(contourTree, contours, -1, (0, 0, 255), 2)plt.subplot(132), plt.axis('off'), plt.title("External contour")plt.imshow(cv2.cvtColor(contourEx, cv2.COLOR_BGR2RGB))plt.subplot(133), plt.axis('off'), plt.title("Tree contour")plt.imshow(cv2.cvtColor(contourTree, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124997075)
Copyright 2022 youcans, XUPT
Crated:2022-5-25
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)
【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)
【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩(cv.moments)
【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征
【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测
【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框
【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】