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)

相关推荐
木心术11 天前
从“能跑“到“好体验“:OpenClaw硬件配置需求深度解析
opencv
格林威2 天前
工业相机图像采集:如何避免多相机数据混乱
人工智能·数码相机·opencv·机器学习·计算机视觉·c#·视觉检测
不懒不懒2 天前
【从入门到实战:OpenCV 人脸识别四种算法实现全解析】
人工智能·opencv·算法
Fleshy数模2 天前
基于 dlib 与 OpenCV 的人脸检测实战:图片与视频场景全解析
人工智能·opencv·音视频
ComputerInBook2 天前
OpenCV图像处理——InputStream类(版本4.12.0)
图像处理·opencv·inputarray
纤纡.2 天前
OpenCV 实现人脸识别:LBPH/Eigen/Fisher 三大算法实战详解
人工智能·opencv·计算机视觉
纤纡.2 天前
OpenCV 实战:基于 Haar 特征的人脸与微笑检测全解析
人工智能·opencv·计算机视觉
Fleshy数模3 天前
玩转OpenCV DNN模块:实现图片与实时视频风格迁移
opencv·音视频·dnn
ComputerInBook3 天前
OpenCV 基本数据结构
数据结构·opencv
Hong_Youth4 天前
OpenCV + YOLOv5 落地工程:视频实时计数、追踪、画线统计
opencv·yolo·音视频