Linux40:查找图形轮廓

图像形状查找在OPENCV里面是非常常见的功能,它常用于视觉任务、目标检测、图像分割等等。在OPENCV中通常使用Canny函数、findContours函数、drawContours函数结合在一起去做轮廓的形检测。

1.findContours函数的简介以及定义

在OPENCV中通常使用findContours函数去寻找图片的轮廓,也是OPENCV中处理轮廓最重要的函数之一,它常用于找到二值图像中所有物体的轮廓。它的实现原理是通过扫描一张二值图像,然后找到所有的轮廓,并把所有的数据存储在向量里面。下面我们来看看findContours的函数定义

CV_EXPORTS_W void findContours( InputOutputArray image,

OutputArrayOfArrays contours,

OutputArray hierarchy, int mode,

int method, Point offset = Point());

**第一个参数:**image输入的二值图像,这个图像通常是用在边缘检测、阈值处理等等

第二个参数: contours输出的轮廓集合,每一个轮廓都是由点组成,通常用**vector<vector<Point>>**来表示

第三个参数: hierarchy输出的轮廓层次结构,这通常表示轮廓之间的父子关系,这个是可选参数,通常用vector<Vec4i> hierarchy来表示。比方说,第i个轮廓,hierarchy[i][0]、hierarchy[i][1]、hierarchy[i][2]、hierarchy[i][3], 依次为第i个轮廓[Next、Pervious、First_Child,Parent], 这表示的是相同等级下种下一轮廓、前一轮廓,第一个子轮廓和父轮廓的索引号。若轮廓i没有下一个,前一个或者父级轮廓,则层次相应的元素是负数。

第四个参数: mode轮廓检索模式,通常有以下选项,分别是:RETR_EXTERNAL (只检测最外层轮廓)、RETR_LIST (检测所有轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,都是独立的)、RETR_CCOMP (检测所有轮廓,但是所有的轮廓只建立两个等级关系,也就是外围是顶层,而外围内的内部轮廓都属于顶层)、RETR_TREE( 检测所有轮廓并建立轮廓树,这个模式下外围轮廓包含内层轮廓,内层还可以继续嵌套**)**

第五个参数: method轮廓近似方法,通常有以下的几种方法,分别是CHAIN_APPROX_NONE( 存储所有顶点)、CHAIN_APPROX_SIMPLE(仅存储轮廓的拐点信息,并把所有轮廓拐点处的点保存到向量里面)、CHAIN_APPROX_TC89_L1(使用TEH_CHAIN近似算法)。

**第六个参数:**offset轮廓点偏移量,默认(0,0)
如下图:

Next **:**表示同一级别的下一个轮廓索引,若我们图片中取出轮廓0,同一水平的下一个是轮廓1。所以说当轮廓 == 0的时候,NEXT就是轮廓1。

Previous **:**表示同一级别的上一个轮廓索引,如轮廓1的同一级别的上一个是轮廓0。以此类推,轮廓2的上一个轮廓是轮廓1。

First_Child **:**表示的是当前轮廓的第一个子轮廓的索引。比方说,对于轮廓2,子轮廓是2a,所以轮廓2的First_Child是轮廓2a相对应的索引值。而对于3a来说,它有两个轮廓分别是6,7, 但这里只能取第一个轮廓,所以这里是6。

Parent **:**表示的是当前轮廓的父轮廓索引,比方说对于轮廓6和轮廓7来说,它们的父轮廓都是3a。

2.drawContours 函数的简介以及定义

在OPENCV中drawContours常用于绘制图像的轮廓,如上图,我们来看看这个函数的API定义:

CV_EXPORTS_W void drawContours( InputOutputArray image,

InputArrayOfArrays contours,

int contourIdx, const Scalar& color,

int thickness = 1, int lineType = LINE_8,

InputArray hierarchy = noArray(),

int maxLevel = INT_MAX, Point offset = Point() );

第一个参数: image输出图像,即绘制轮廓后的图像

第二个参数: contours轮廓的集合,它是由一系列的点组成

第三个参数: contourIdx、轮廓索引数组,指定要绘制哪些轮廓

第四个参数: contourColor **,**轮廓颜色,使用Scalar类型表示

第五个参数: thickness **,**轮廓线宽,默认1

第六个参数: lineType **,**轮廓线类型,默认为LINE_8

第七个参数: hierarchy **,**轮廓层次结构,用于绘制轮廓的父子关系。默认为noArray()

第八个参数: maxLevel 表示绘制轮廓的最大层级数量**。**若maxLevel 为0,则只绘制指定的轮廓;若maxLevel 为1,则绘制轮廓极其所有嵌套轮廓;若maxLevel 为2,则绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套的轮廓。

**第九个参数:**轮廓点的偏移量,默认为(0,0)

相关推荐
放下华子我只抽RuiKe52 小时前
机器学习全景指南-总结与展望——构建你的机器学习工具箱
人工智能·深度学习·opencv·学习·目标检测·机器学习·自然语言处理
我材不敲代码2 小时前
计算机视觉基础——opencv的基础操作
人工智能·opencv·计算机视觉
智驱力人工智能4 小时前
智慧物流中心为何需要包装缺陷检测 商品包装检测 包装标签合规检测 物流包装AI视觉检测系统 电商包装自动化检测 快递封箱完整性AI识别
人工智能·opencv·目标检测·计算机视觉·视觉检测·边缘计算
Daydream.V6 小时前
Opencv——图片处理(二)
人工智能·opencv·计算机视觉
格林威11 小时前
工业相机图像高速存储(C#版):先存内存,后批量转存方法,附堡盟 (Baumer) 相机实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·halcon
Sunhen_Qiletian11 小时前
OpenCV中透视与仿射变换的区别——从矩阵到实战的全面解析
opencv·算法·矩阵
格林威12 小时前
工业相机图像高速存储(C#版):内存映射文件方法,附海康相机C#实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
AI科技星12 小时前
v=c空间光速螺旋量子几何归一化统一场论——全维度ω、r、f推导G与c的终极关联及严格证明
开发语言·opencv·r语言
輕華12 小时前
OpenCV 实战封神榜(下):轮廓检测 + 模板匹配,从特征提取到精准匹配
人工智能·opencv·计算机视觉