轮廓查找与绘制

轮廓查找与绘制

1)什么是轮廓

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度,提取轮廓就是提取

这些具有相同颜色或者灰度的曲线,或者说是连通域,轮廓在形状分析和物体的检测和识别中非常有用。
注意事项:

①为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测

②查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量

中img.copy()

③在OpenCV 中,查找轮廓就像在黑色背景中找白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。

常用函数: cv2.findContours()-----查找轮廓cv2.drawContours()-----绘制轮廓

在这里插入图片描述
查找轮廓—cv2.findContours()
在这里插入图片描述
⚫image: 输入图像, 8位单通道图像(一般为二值图)
⚫contours: 检测到的轮廓, 每个轮廓存储为一个点向量, 即Point类型的vector表示
⚫hierarchy: 可选的输出向量, 包含图像的拓扑信息。其作为轮廓数量的表示, 包含了许多元素, 每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0]~hierarchy[i][3], 分别表示后一轮廓、前一轮廓、父轮廓、内嵌轮廓的索引编号, 如果没有对应项, 设置为负数
⚫mode: 轮廓检索模式, 取值如下:
cv2.RETR_EXTERNAL=0-----表示只检测最外层轮廓cv2.RETR_LIST=1------提取所有轮廓并放置在list中, 轮廓不建立等级关系cv2.RETR_CCOMP=2------提取所有轮廓并组织为双层结构cv2.RETR_TREE =3------提取所有轮廓并重新建立网状轮廓结构
⚫method: 轮廓的近似方法, 取值见图2
⚫offset: 每个轮廓的可选偏移量, 默认值Point()

在这里插入图片描述
CV_CHAIN APPROX NONE 连续存储所有的轮廓点,何两个相邻的点都是水平、垂直或者斜相的。也就是说

max(bs(x1-x2),ab (y2-y1))==1.

·CV CHAIN APPROXSIMPLE 压缩存储,对于水平,垂直或者斜向的线段,只会保存端点。比如一个四边形,只会存

储四个顶点。

CHAIN APPROXTC89L1,CV_CHAIN QPPROXTC89KCOS使用Teh-Chin链逼近算法中的一个

LINK RUNS与上述的算法完全不同,连接所有的水平层次的轮廓。

contours, hierarchy = cv2.findContours (mask, CV2.RETR EXTERNAL, CV2.CHAIN APPROX SIMPIE)

thresh,contours,hierarchy = cv2.findContours(thresh, CV2.RETR TREE,CV2.CHAIN APPROX SIMPIE)

绘制轮廓—cv2.drawContours()

在这里插入图片描述

⚫image: 目标图像, Mat类型对象即可
⚫contours: 所有的输入轮廓, 每个轮廓存储为一个点向量
⚫contourIdx: 轮廓绘制指示变量(索引), 若为负值, 则表示绘制所有轮廓
⚫color: 绘制轮廓的颜色
⚫thickness: 轮廓线条的粗细, 默认值1, 如果为负值, 则绘制轮廓内部, 可选宏 CV_FILLED
⚫lineType: 线条类型, 默认值8
⚫hierarcy: 可选的层次结构信息, 默认值noArray()
⚫maxLevel: 表示用于绘制轮廓的最大等级, 默认值INT_MAX
⚫offset: 可选的轮廓偏移参数, 默认值Point()
cv2.drawContours(img1, contours,-1, (0,0,255)2)

在这里插入图片描述

2)如何访问每一个轮廓

for i in range (0,len (contours)) :
  #cv2.drawContours (img,contours[i],-1,(0,255,0) ,5)
   cv2 .drawContours (img,contours ,i,(0,255,0) ,5)
for cnt in contours:
    cv2.drawContours (img,cnt,-1, (0,255,0) ,5)

3)如何访问每一个轮廓的所有点

for i in range (0,len (contours)) :
    for j in range (0,len (contours[il)) :
       cv2.drawContours(img,contours[il,j,(0,255,0) ,3)
for cnt in contours:
    for j in range(0,len (cnt)) :
         cv2 .drawContours (img,cnt,j,(0,255,0) ,3)

len(contours)------所有轮廓的个数
len(contours[i])------第i个轮廓所有点的个数
在这里插入图片描述

4)轮廓存储结构

mode: 轮廓检索模式,取值如下CV2.RETR EXTERNAL=0-----表示只检测最外层轮廓
Cv2.RETR LIST=1------提取所有轮廓并放置在list中,轮廓不建立等级关系
cv2.RETR CCOMP=2------提取所有轮廓并组织为双层结构
CV2.RETR TREE =3------提取所有轮廓并重新建立网状轮廓结构

猜你喜欢

转载自blog.csdn.net/weixin_40911806/article/details/130053518