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个轮廓,hierarchyi0、hierarchyi1、hierarchyi2、hierarchyi3, 依次为第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)

相关推荐
兵慌码乱3 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
梦想三三7 天前
OpenCV银行卡数字识别项目(图像预处理与字符分割)
人工智能·opencv·计算机视觉
武子康7 天前
调查研究-180 roboflow/supervision:计算机视觉工程里的“胶水层“,为什么值得关注?
人工智能·opencv·计算机视觉·chatgpt·llm·向量化
m沐沐7 天前
【计算机视觉】OpenCV 模板匹配银行卡数字识别---下
人工智能·python·opencv·计算机视觉·pycharm·numpy
fie88897 天前
SSR / MSR 图像增强
人工智能·opencv·计算机视觉
sali-tec7 天前
C# 基于OpenCv的视觉工作流-章85-包胶不良检测
图像处理·人工智能·opencv·算法·计算机视觉
FL16238631298 天前
[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型
开发语言·c++·opencv
2401_885665198 天前
基于OpenCV的模板匹配OCR实战:银行卡与身份证数字识别完整教程
人工智能·python·opencv·计算机视觉·ocr
winfredzhang8 天前
用 MediaPipe 手势数字识别一键打开下载夹里的图片(Python + OpenCV 实战)
人工智能·python·opencv·google·mediapipe
sali-tec9 天前
C# 基于OpenCv的视觉工作流-章84-包胶有无检测
图像处理·人工智能·opencv·算法·计算机视觉