Han Xu's blogs
  • 🥳欢迎!
  • Linux
    • 【Linux_install】详细的Ubuntu和win双系统安装指南
    • 【Linux】分区向左扩容的方法
    • 【Linux】挂载硬盘并设置开机自动挂载
    • 【Linux】grub命令行引导进入windows系统
    • 【Linux】python版本控制和环境管理
    • 【Linux】安装n卡驱动,美化gnome
    • 【Linux】gnome桌面环境切换KDE Plasma
  • python
    • 【matplotlib教程】数据可视化
    • 【python】实战:大批量数据的处理和拟合
    • 【Python爬虫】批量爬取图片的简单案例
    • 【scikit-opt】七大启发式算法的使用
    • 【综合评价方法】常见综合评价方法及其实现
    • 【python教程】打包和发布自己的项目,让别人去pip
    • 【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程
    • 【Pytorch教程】迅速入门Pytorch深度学习框架
    • 【稀疏矩阵】使用torch.sparse模块
  • C_C++
    • 【CMake】掌握CMake基本操作
    • 【计算机二级C++】题目与C++知识自检
  • matlab
    • 【Matlab】基础教程
  • 🤖ROS
    • 【ROS教程】安装ROS全流程及可能遇到的问题
    • 【ROS教程】用CLion编译和调试ROS包的全流程及可能遇到的问题
    • 【ROS教程】ROS文件系统和基础架构
    • 【ROS教程】ROS常用命令
    • 【ROS教程】话题通信
    • 【ROS教程】服务通信
    • 【ROS教程】ROS常用API讲解
    • 【ROS教程】编写launch文件
  • 📷Computer_Vision
    • Novel_View_Synthesis
      • 【NeRF】由浅入深介绍Neural_Radiance_Fields
      • 【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化
      • 【3DGS】从新视角合成到3D_Gaussian_Splatting
      • 【NeRF】截至2024.12NeRF系列工作总结
    • SLAM
      • 【Survey】截至2024.12SLAM系列工作总结
    • OpenCV
      • 【OpenCV教程合集】一文入门和精通OpenCV(C_C++)
      • 【OpenCV教程】OpenCV中的数据类型
      • 【OpenCV教程】OpenCV中对矩阵的常用操作
      • 【OpenCV教程】对图像的各种常用操作
      • 【OpenCV教程】滤波和边缘检测的过程
      • 【OpenCV教程】如何优雅地画出一个几何图形
      • 【OpenCV教程】Trackbar到底怎么用?
      • 【OpenCV教程】轮廓检测过程
      • 【OpenCV教程】特征工程
  • 🗑️杂七杂八的~
    • 【LaTex、markdown】常用语法写出漂亮的blog
    • 【git教程】快速掌握git
    • 【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享
    • 《周易》:大衍筮法
    • 【PyCharm】解决虚拟环境pip无法使用问题
    • 【git】解决能访问github但克隆不了的问题
    • 【Windows终端美化】为什么你的终端千篇一律?
Powered by GitBook
On this page
  • 1.查找轮廓
  • 1.1 API
  • 1.2 轮廓层级检测模式:索引号(层级)
  • 1.3 轮廓坐标点储存方式
  • 2.绘制轮廓
  • 2.1 API
  • 3.轮廓面积和周长
  • 3.1 面积(非原地算法)
  • 3.2周长(非原地算法)
  • 4.多边形逼近
  • 5.凸包
  • 6.外接矩形
  • 6.1最小外接矩形(返回RotatedRect)
  • 6.2最大外界矩形(返回Rect)

Was this helpful?

  1. Computer_Vision
  2. OpenCV

【OpenCV教程】轮廓检测过程

Previous【OpenCV教程】Trackbar到底怎么用?Next【OpenCV教程】特征工程

Last updated 6 months ago

Was this helpful?

@


1.查找轮廓

1.1 API

CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset = Point());

/** @overload */
CV_EXPORTS void findContours( InputArray image, OutputArrayOfArrays contours,
                              int mode, int method, Point offset = Point());
  • 参数如下

参数
含义

image

输入图片,数据类型Mat

contours

保存输出轮廓的点坐标。通常用vector<vector<Point>>数据类型担任,通过Point可以看出存储的是坐标。

hierarchy

可选参数,保存输出轮廓的层级关系。通常用vector<Vec4i>数据类型担任。 详见下文

mode

轮廓层级的检测模式 ,详见下文

method

轮廓坐标点的储存方式 ,详见下文

offset

额外偏移量,在每一个检测出的轮廓点上加上该偏移量,可以是负值。当所分析图像是另外一个图像的ROI的时候,通过加减这个偏移量,可以把ROI图像的检测结果投影到原始图像对应位置上。

  • hierarchy[i][0]:第i个轮廓的同一层级后一个轮廓的索引编号。

  • hierarchy[i][1]:第i个轮廓的同一层级前一个轮廓的索引编号。

  • hierarchy[i][2]:第i个轮廓的子轮廓的索引编号。

  • hierarchy[i][3]:第i个轮廓的父轮廓的索引编号。

  • 如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。

1.2 轮廓层级检测模式:索引号(层级)

enum RetrievalModes {
    RETR_EXTERNAL  = 0,
    RETR_LIST      = 1,
    RETR_CCOMP     = 2,
    RETR_TREE      = 3,
};

RETR_EXTERNAL(索引顺序:从右下到左上)

只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略

RETR_LIST(recommended)(索引顺序:从右下到左上,由外到内)

检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立层级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarch[i]向量内所有元素的第3、第4个分量都会被置为-1。

RETR_CCOMP(not recommended)(索引顺序:由内到外,从右下到左上)

检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层

RETR_TREE(recommended)

检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

1.3 轮廓坐标点储存方式

enum ContourApproximationModes {
    CHAIN_APPROX_NONE      = 1,
    CHAIN_APPROX_SIMPLE    = 2,
    CHAIN_APPROX_TC89_L1   = 3,
    CHAIN_APPROX_TC89_KCOS = 4
};
  • method可选值如下

method可选值
含义

CHAIN_APPROX_NONE

保存物体边界上所有连续的轮廓点到contours向量内

CHAIN_APPROX_SIMPLE(recommended)

仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留,效率比较高。

CHAIN_APPROX_TC89_L1或CV_CHAIN_APPROX_TC89_KCOS

使用tehChinl chain 近似算法(not important)

2.绘制轮廓

2.1 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

绘制轮廓的画布,数据类型Mat

contours

输入轮廓,数据类型vector<vector<Point>>

contourIdx(contour index)

欲绘制的轮廓的索引值,输入-1可以绘制所有轮廓

color

绘制线条的颜色

thickness

绘制线条的粗细。若取负值,则表示进行填充

lineType

绘制线条的连通类型

hierarchy

可选的层次结构信息。它仅在当你需要绘制一些轮廓线时被使用。(详见参数maxLevel)默认为noArray(),返回一个空数组。

maxLevel

绘制轮廓线的最高级别。此参数仅在参数hierarchy有效时被考虑。详见下表

offset

额外偏移量,在每一个绘制出的轮廓点上加上该偏移量,可以是负值。当所分析图像是另外一个图像的ROI的时候,通过加减这个偏移量,可以把ROI图像的绘制结果投影到原始图像对应位置上。

  • maxLevel可选值如下

maxLevel可选值
含义

0

只有被指定的轮廓被绘制

1

绘制被指定的轮廓和其下一级轮廓

2

绘制被指定的轮廓和其所有子轮廓

3.轮廓面积和周长

3.1 面积(非原地算法)

CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false );
  • 参数如下

参数
含义

contour

某一个轮廓,数据类型vector<Point>

oriented

有方向的区域标志(not important)。若为true: 此函数依赖轮廓的方向(顺时针或逆时针)返回一个已标记区域的值。若为false: 默认值,意味着返回不带方向的绝对值。

  • 此函数利用格林公式计算轮廓的面积。对于具有自交点的轮廓,该函数几乎肯定会给出错误的结果。

3.2周长(非原地算法)

CV_EXPORTS_W double arcLength( InputArray curve, bool closed );
  • 参数如下

参数
含义

curve

某一个轮廓,数据类型vector<Point>

closed

轮廓是否是闭合的

4.多边形逼近

CV_EXPORTS_W void approxPolyDP( InputArray curve,
                                OutputArray approxCurve,
                                double epsilon, bool closed );
  • 参数如下

参数
含义

curve

某一个轮廓,数据类型vector<Point>

approxCurve

输出多边形的点集,数据类型vector<Point>

epsilon

设置精度,越小则精度越高,多边形越趋近于曲线,拟合效果更好但效率低。

closed

轮廓是否是闭合的

5.凸包

CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull,
                              bool clockwise = false, bool returnPoints = true );
  • 参数如下

参数
含义

points

输入点集,数据类型vector<Point>

hull

输出凸包。数据类型取决于returnPoints,vector<Point>或vector<int>

clockwise

拟合凸包的直线的转动方向,TRUE为顺时针,否则为逆时针。

returnPoints

若为true,则在hull中存储点的坐标。若为false,则在hull中存储点的索引,索引值根据参数points得到。默认为true

6.外接矩形

6.1最小外接矩形(返回RotatedRect)

CV_EXPORTS_W RotatedRect minAreaRect( InputArray points );
  • 参数如下

参数
含义

points

输入点集,数据类型vector<Point>

6.2最大外界矩形(返回Rect)

CV_EXPORTS_W Rect boundingRect( InputArray array );
  • 参数如下

参数
含义

points

输入点集,数据类型vector<Point>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
📷
TOC