【OpenCV教程】轮廓检测过程

news/2024/11/15 6:44:28/文章来源:https://www.cnblogs.com/UnderTurrets/p/18369315

@

目录
  • 1.查找轮廓
    • 1.1 API
    • 1.2 轮廓层级检测模式:索引号(层级)
      • RETR_EXTERNAL(索引顺序:从右下到左上)
      • RETR_LIST(recommended)(索引顺序:从右下到左上,由外到内)
      • RETR_CCOMP(not recommended)(索引顺序:由内到外,从右下到左上)
      • RETR_TREE(recommended)
    • 1.3 轮廓坐标点储存方式
  • 2.绘制轮廓
    • 2.1 API
  • 3.轮廓面积和周长
    • 3.1 面积(非原地算法)
    • 3.2周长(非原地算法)
  • 4.多边形逼近
  • 5.凸包
  • 6.外接矩形
    • 6.1最小外接矩形(返回RotatedRect)
    • 6.2最大外界矩形(返回Rect)


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>

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:P10279 [USACO24OPEN] The Winning Gene S

思路 建议升蓝。 算法一 考虑暴力。 我们先枚举 \(K,L\),考虑如何求解。 直接枚举每一个 \(K\)-mer,再枚举里面的每一个长度为 \(L\) 的子串,找到最大的子串并在起始部分打一个标记。最后直接看有几个地方被打标记就行。 时间复杂度:\(O(n^4)\)。预计能过测试点 \(1-4\)。 …

C10-02-HTML示例

HTML:02-1.html 基本功能实现:<a>和<img>标签联合使用及<img src="#"> 图片资源绝对路径引用JS使用:行内式、内嵌式、引入外部JS<input>标签:输入标签文本框<!DOCTYPE html> <html lang="en"> <head><me…

异常与中断的概念以及处理流程

1.CPU理解的中断CPU 在运行的过程中,也会被各种“异常”打断。这些“异常”有:指令未定义 指令、数据访问异常 SWI(软中断) 快中断 中断中断也是 “异常” 的一种,导致中断发生的情况有按键 定时器 ADC转换完成 uart 发送完数据,收到收据 等等 这些众多的“中断源”,汇集到…

wifi基础(一):无线电波与WIFI信号干扰、衰减

liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问:为什么我们在高速移动的高铁上网络会变慢? 为什么 5G WiFi 的穿墙能力没有 2.4G 的好? 为什么在对 WiFi 进行 iperf 拉距测试的时候,…

监理单位项目管理系统:选择前你必须知道的事

国内外主流的 10 款监理单位项目管理系统对比:PingCode、Worktile、Primavera P6、Microsoft Project、Wrike、Asana、Trello、红圈、泛微项目协同工具、广联达。在寻找适合监理单位的项目管理系统时,许多专业人士面临着复杂性和成本效益的双重挑战。一个好的系统不仅需要具备…

多任务进程与线程

多任务进程与线程 一、多任务介绍 ​ 我们生活中有很多事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;用程序来模拟: from time import sleepdef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():…

生产工时管理系统:提高效率的秘诀

国内外主流的10款工时管理平台对比:.Teambition; 2.Tower; 3.蓝凌OA; 4.ClockShark; 5.Hubstaff; 6.TimeClock Plus; 7.Jibble; 8.MISys Labor Tracking;9.PingCode;10.Worktile。在选择合适的工时管理平台时,你是否感到挑战重重?市场上的各种选项似乎都声称能够提…

ArgoWorkflow教程(二)---快速构建流水线:Workflow Template 概念

上一篇我们部署了 ArgoWorkflow,并创建了一个简单的流水线做了个 Demo。本篇主要分析 ArgoWorkflow 中流水线相关的概念,了解概念后才能更好使用 ArgoWorkflow。本文主要分析以下问题:1)如何创建流水线? Workflow 中各参数含义 2)WorkflowTemplate 流水线模版如何使用, …

神经网络之卷积篇:详解单层卷积网络(One layer of a convolutional network)

详解单层卷积网络 如何构建卷积神经网络的卷积层,下面来看个例子。已经写了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的44矩阵。假设使用第一个过滤器进行卷积,得到第一个44矩阵。使用第二个过滤器进行卷积得到另外一个44矩阵。最终各自形成一个卷积神经网络层…

小小的引用计数,大大的性能考究

本文基于 Netty 4.1.56.Final 版本进行讨论在上篇文章《聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现》 中,笔者详细地为大家介绍了 ByteBuf 整个体系的设计,其中笔者觉得 Netty 对于引用计数的设计非常精彩,因此将这部分设计内容专门独立出来。Netty 为 ByteBuf 引入…

【生化代谢基础笔记】RNA 合成

第一节 原核生物转录的模板和酶⚠️ RNA合成需要:DNA Template,NTP,RNA pol,其他蛋白质因子,$Mg^{2+}$一、原核生物转录模板模板链(Template strand) VS 编码链(Coding strand)模板链为合成模板另一股单链为编码链,mRNA 碱基序列与编码链一致二、RNA 聚合酶催化 RNA …

暑假集训CSP提高模拟 25

暑假集训CSP提高模拟 25 组题人: @KafuuChinocpp | @H_Kaguya\(T1\) P235.可持久化线段树 \(0pts\)弱化版: SP11470 TTM - To the moon标记永久化主席树板子。点击查看代码 const ll p=998244353; ll a[100010]; struct PDS_SMT {ll root[100010],rt_sum;struct SegmentTree{…