首页 > 其他分享 >【OpenCV教程】轮廓检测过程

【OpenCV教程】轮廓检测过程

时间:2024-08-20 13:49:55浏览次数:10  
标签:教程 RETR 索引 数据类型 OpenCV vector 参数 轮廓

@

目录


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 发布!

标签:教程,RETR,索引,数据类型,OpenCV,vector,参数,轮廓
From: https://www.cnblogs.com/UnderTurrets/p/18369315

相关文章

  • ASSESS手工注入(附搭建教程)
    ASSESS搭建文章顶部有靶场搭建环境1.将环境压缩包放入wwwroot更目录下 2.进入网页访问自己IP就可以访问到自己搭建的靶场了 如下图所示  ASSESS手工注入一.判断注入点http://172.16.1.49/custom.asp?id=1and1=1http://172.16.1.49/custom.asp?id=1%20and%201=1......
  • ArgoWorkflow教程(二)---快速构建流水线:Workflow & Template 概念
    上一篇我们部署了ArgoWorkflow,并创建了一个简单的流水线做了个Demo。本篇主要分析ArgoWorkflow中流水线相关的概念,了解概念后才能更好使用ArgoWorkflow。本文主要分析以下问题:1)如何创建流水线?Workflow中各参数含义2)WorkflowTemplate流水线模版如何使用,3)Workflow、Wo......
  • CE修改器使用教程 [入门篇]
    原文地址:CE修改器使用教程[入门篇]-腾讯云开发者社区-腾讯云(tencent.com) CheatEngine一般简称为CE,它是一款开放源代码的作弊软件,其主要功能包括、内存扫描、十六进制编辑器、动态调试功能于一体,且该工具自身附带了安全工具,可以用它很方便的生成自己的脚本,CE可以说是目前......
  • 数据结构之 红黑树入门教程、红黑树代码示例
    红黑树(Red-BlackTree)是一种自平衡的二叉查找树(BST),它在插入、删除和查找操作后通过一些特定的规则来维护树的平衡,从而确保这些操作的时间复杂度始终为O(logn)。红黑树主要应用在需要高效动态集合操作的场景中,如操作系统中的进程调度器、数据库中的索引等。红黑树的基本性......
  • 数据结构详细教程绪论
    ......
  • idea 修改背景图片教程
    ......
  • 基于PHP+MySQL组合开发的DIY分销商城小程序源码系统 附带源代码包以及搭建部署教程
    系统概述随着消费者对购物便捷性、个性化需求的不断增长,传统的电商模式已难以满足市场多样化需求。分销商城小程序以其低门槛、易传播、高粘性等特点,成为众多商家转型升级的首选。本源码系统正是基于这一市场需求,利用PHP这一成熟稳定的后端开发语言和MySQL数据库,结合微信小程......
  • OpenCV(cv::SparseMat)
    目录1.主要特点和用途2.主要方法和成员函数3.示例代码4.优缺点cv::SparseMat是OpenCV中表示稀疏矩阵的类。稀疏矩阵用于存储大多数元素为零的矩阵,以节省内存和计算时间。与普通的密集矩阵不同,稀疏矩阵仅存储非零元素及其坐标。1.主要特点和用途稀疏数据存储:当......
  • 【Minecraft】京东云轻量云主机搭建我的世界联机服务器教程(Java版)
    一、Minecraft介绍《我的世界》(英语:Minecraft)是一款沙盒游戏,最初由瑞典游戏设计师马库斯·阿列克谢·泊松单独开发,随后由2009年成立的瑞典公司Mojang开发并发行。玩家可以在一个随机生成的3D世界内,以带材质贴图的立方体为基础进行游戏。游戏中的其他特色包括探索世界、采集资......
  • Docker 入门教程
    本文是官方GettingStarts教程的阅读笔记,包含对步骤、命令的记录和解释。教程分一系列课程,包括有:安装Docker运行容器和创建自定义容器创建高效可复用的镜像,并推送到DockerHub上GetDockerDesktopDockerDesktop是简单易用的Docker工具软件,使用DockerDesktop可......