当前位置: 首页 > news >正文

【C++的OpenCV】第十二课-OpenCV图像常用操作(九):找到图像的边界(轮廓)findContours()和drawContours()

🎉🎉🎉欢迎各位来到小白piao的学习空间!\color{red}{欢迎各位来到小白piao的学习空间!}欢迎各位来到小白piao的学习空间!🎉🎉🎉
💖💖💖持续更新,期待关注!\color{blue}{持续更新,期待关注!}持续更新,期待关注!💖💖💖

目前已经为大家更新了:\color{green}{目前已经为大家更新了:}目前已经为大家更新了:

  1. Python基础、中级、高级;
  2. C++数据结构和算法;
  3. Python数据结构和算法;
  4. OpenCV相关内容等重点内容

我的主页:\color{purple}{我的主页:}我的主页:我的主页


我的资源:\color{purple}{我的资源:}我的资源:我的资源

  1. IT技术各档次简历模板
  2. 各类项目(企业、毕设)
  3. 数据库安装包(Mysql8.0)
  4. 技能资料(电子书、软考等)


----------------------------------以下为正式内容----------------------------------------

前言\color{purple}{前言}前言

        大家通过前边的内容的学习,想必对于图像形态学有了初步的了解,了解原理之后,我们来看一写灵活的应用。今天的实例,可以好好品一品,如果能理解,那么将会对你在轮廓识别这里理解原理!注释就是答案!


前文链接:【C++的OpenCV】第十一课-OpenCV图像常用操作(八):直方图计算(cv.calc())


一、绘制轮廓的方法\color{blue}{一、绘制轮廓的方法}一、绘制轮廓的方法

1.1绘制轮廓的目的\color{green}{1.1 绘制轮廓的目的}1.1绘制轮廓的目的

        快速找到图形的边界有助于进行图像或者特定图形的比较工作以及后期一些训练模型中的基本方法的实现,用于后期成熟项目中。在项目中也充分发挥着其作用。

1.2所使用的基本方法\color{green}{1.2 所使用的基本方法}1.2所使用的基本方法

1.2.1cv::findContours()\color{purple}{1.2.1 cv :: findContours()}1.2.1cv::findContours()

  • 函数原型:
// 原型一:
void cv::findContours	(	InputArray 	image,OutputArrayOfArrays 	contours,OutputArray 	hierarchy,int 	mode,int 	method,Point 	offset = Point() )	

// 原型二:
void cv::findContours	(	InputArray 	image,OutputArrayOfArrays 	contours,int 	mode,int 	method,Point 	offset = Point() )	
  • 函数功能:
            在一个二进制图片中找到轮廓;该函数使用算法240号从二进制(二值0和1)图像中检索轮廓。轮廓是形状分析、物体检测和识别的有用工具。请使用opencv3.2以上的版本!

  • 参数解释:

    • 原型一中:
      • image:要找轮廓的一张8位单通道二进制的源图像,其中非0的像素为1,0像素依旧为0,所以图像被认为是二进制的图像。可以使用compare、inRange、threshold、adaptiveThreshold、Canny等来创建灰度或彩色的二进制图像。如果参数mode等于RETR_COMPRETR_FLOODFILL,则输入也可以是标签的32位整数图像CV_32SC1)。
      • contours: 检测到的轮廓,每一个轮廓视为一个由多个点组成的矢量(vector)容器。 (例如:std::vector<std::vector<cv::Point> >,最外侧的vector存储图片中的所有轮廓,第二个vector存储每个轮廓的数据信息).
      • hierarchy:可选的(这是今天的难点哦)(不选的参考原型二即可)输出的向量容器(例如std::vector<cv::Vec4i>),包含有关图像拓扑的信息。它的元素(就是hierarchy中的元素)与轮廓的数量一样多(元素个数 = 轮廓个数)。对于每一个边界contour[i],对应的hierarchy[i]中有四个元素: hierarchy[i][0] , hierarchy[i][1] , hierarchy[i][2] , 和 hierarchy[i][3]的这些元素,会被分别设置成这个轮廓(注意:这些源图像中的轮廓是必须在同一级的!)的上一层轮廓、下一层轮廓、第一个子轮廓、父轮廓的基于0的索引【这个过程就是对源图像中的某个或者所有轮廓进行的拓扑操作】。
      • mode:轮廓检索的模式,详情参见:轮廓检索模式列表
      • method:边界近似的方法,详情参见:轮廓近似方法列表
      • offset:可选的轮廓点的偏移量,这是一个很有用的参数,对于你要分析整张图片上下文中提取出ROI且进行分析的时候。
    • 原型二的参数和原型一中的参数同样的含义

1.2.2cv::drawContours()\color{purple}{1.2.2 cv :: drawContours()}1.2.2cv::drawContours()

  • 函数原型:

void cv::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() )	
  • 函数功能:
    绘制轮廓线或者填充轮廓!如果thickness≥0,该函数在图像中绘制轮廓线,如果thickness<0,则填充轮廓所圈定的区域

  • 参数解释:

    • image: 目标图片,即要画轮廓的那个图片
    • contours:所有的轮廓,每个轮廓是一个点容器,所有轮廓被装在一个容器中
    • contourIdx:轮廓索引 i,i > 0时,i是几就画 i 所对应的轮廓,如果 i < 0 就画出所有轮廓
    • color:轮廓线的颜色
    • thickness:轮廓线厚度,如果这个值为负值(例如:thickness=FILLED),则填充轮廓内部
    • lineType:轮廓线的连接方式,参见线条连接样式列表
    • hierarchy:关于层次结构的可选信息。仅当您只想绘制部分轮廓时,才需要此选项(请参见maxLevel)。
    • maxLevel: 绘制轮廓的最大级别。如果为0,则仅绘制指定的轮廓。如果为1,函数将绘制该轮廓和所有嵌套轮廓。如果为2,则函数绘制轮廓、所有嵌套轮廓、所有的嵌套到嵌套轮廓等。此参数仅在有可用hierarchy时考虑。
    • offset:可选轮廓偏移参数。将所有绘制的轮廓移动指定的偏移量=(dx,dy)。

1.3实际案例\color{green}{1.3 实际案例}1.3实际案例

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{Mat src = imread("/home/aelx-chen/demo.jpg");//初始化一张空图片dst用于存储画轮廓后的结果Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);src = src > 1; // 这是一个简单的二进制图像处理的方法,将图像转换为二进制图像。imshow( "Source", src ); // 显示源图像vector<vector<Point> > contours; //边界容器vector<Vec4i> hierarchy;// 层级容器findContours( src, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE );// 找src的轮廓,拓扑存入hierarchy中,//采用“检索所有轮廓并将其组织为两级层次结构。//在顶层,有组件的外部边界。在第二层,有洞的边界。//如果连接组件的孔内有另一个轮廓,则仍将其置于顶层”的检索模式(RETR_CCOMP),//和“压缩水平段、垂直段和对角段,只保留其端点。”的近似方法(CHAIN_APPROX_SIMPLE 简单线性近似)找到轮廓。int idx = 0; // 索引从0开始//遍历顶层的所有轮廓画轮廓:为什么是顶层?//因为找轮廓的方法中的参数RETR_CCOMP决定了找到的轮廓只有两层,//所以这个轮廓的上一层就是顶层了(注意,这种模式是指将轮廓拆为两层去检索的模式)。for( ; idx >= 0; idx = hierarchy[idx][0] ){Scalar color( rand()&255, rand()&255, rand()&255 );//随机彩色drawContours( dst, contours, idx, color, FILLED, 8, hierarchy );//画轮廓// idx就是轮廓的索引(注意这是hierarchy这个容器中的下标,这个容器中存储的是轮廓的拓扑信息,即这个轮廓的上一层、后一层、第一个子轮廓、父轮廓,之所以这样是因为可以关联到contours和hierarachy,很巧妙!【hierarchy这个容器中我们下方使用图解供大家理解】),}imshow( "Components", dst );waitKey(0);
}

1.4彩蛋\color{green}{1.4 彩蛋}1.4彩蛋

  • 关于findContours()中 hierarchy 参数的图解(如果你能认真看到这里,那你对这个画轮廓的原理和图像学相关知识将会非常理解。)
  • hierarchy其实就是一个容器(类似这种:vector<Vec4i>),而Vec4i又是一个容器,所以这是一个二维容器。
    上图:
    在这里插入图片描述
    所以,这部分干货,你懂了吗?
  • 关于拓扑:
    在这里插入图片描述
    就差不多这个意思,实际上就是轮廓(或者图像)沿四个方向的拓展。(上下里外)

💖💖💖持续更新,期待关注!\color{blue}{持续更新,期待关注!}持续更新,期待关注!💖💖💖

相关文章:

【C++的OpenCV】第十二课-OpenCV图像常用操作(九):找到图像的边界(轮廓)findContours()和drawContours()

&#x1f389;&#x1f389;&#x1f389;欢迎各位来到小白piao的学习空间&#xff01;\color{red}{欢迎各位来到小白piao的学习空间&#xff01;}欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&#x1f496…...

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆&#xff0c;上次有报道发布站一年盈利几个亿&#xff0c;还是有很大的机会&#xff0c;很多玩家因为GM开服关服给折腾&#xff0c;刚充的钱服务器就关了&#xff0c;很是恼火&#xff0c;于是都想自己整个服开开&#xff0c;但又不知道从何下手&…...

【GoF 23】篇3:抽象工厂

1. 什么是抽象工厂&#xff1f; 提供一个创建一系列相关或互相依赖的对象接口&#xff0c;而无需指定它们的具体类。 抽象工厂是一个超级工厂&#xff0c;是其他工厂的工厂&#xff0c;或将简单工厂进一步抽象。 这样来理解&#xff1a; 我们将科技公司可以做的事情简要枚举…...

软考高级信息系统项目管理师系列之三十七:流程管理

软考高级信息系统项目管理师系列之三十七:流程管理 一、流程管理内容二、流程管理基础概念知识1.企业业务流程的整体目标2.业务流程的核心3.流程六要素4.良好的业务流程管理步骤5.企业流程管理的层次三、流程管理过程1.业务流程分析2.业务流程分析的主要方法3.业务流程分析工具…...

【WPS文字-Word】WPS文字设置段落居中对齐后公式左边右边的文字仍然无法跟公式对齐,公式和文字对不齐

一、问题背景 原来的公式左边文字是底端&#xff0c;右边文字是居中&#xff0c;我想着让左右文字全跟公式居中对齐&#xff0c;就全部设置了段落居中对齐。 结果发现&#xff0c;公式左右边的文字依然无法居中对齐。左边的文字是居中&#xff0c;但是右边的文字变成了顶端对…...

英文术语对照

underlying asset 标的资产 leverage 杠杆 forward 远期 futures 期货 options 期权 delivery 交割 broker 证券机构/经理人 CBOT 芝加哥交易所 long futures position 多头 short futures position 空头 spot price 现货价格 future price 期货价格 over-the-coun…...

CSS 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…...

【Redis黑马点评】基于session实现登录【短信验证码登录、登录验证功能、拦截器】过程详解

文章目录一. 黑马点评Redis项目实践1.1开发环境搭建1.1.1 数据库1.1.2 Springboot项目1.1.3 前端配置1.2 基于session实现登录1.2.1 发送短信验证码1.2.2 短信验证码登录1.2.3 登录验证功能1.2.3.1 编写拦截器一. 黑马点评Redis项目实践 1.1开发环境搭建 1.课程介绍&#xff…...

【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解

苦尽甘来 文章目录一、仿函数&#xff08;仿函数就是一个封装()运算符重载的类&#xff09;1.C语言的函数指针2.C的仿函数对象二、priority_queue中的仿函数1.模拟实现优先级队列1.1 优先级队列的本质&#xff08;底层容器为vector的适配器&#xff09;1.2 向下调整算法建堆1.3…...

网络安全 -- 常见的攻击方式和防守

网络安全 – 常见的攻击方式和防守 一 . 网页中出现黑链 特点: 隐藏,不易发现,字体大小是0,表面上看不出来,代码层面可以查出来,也可能极限偏移,颜色一致 表现: 多表现为非法植入链接,一般点击会跳转至其他网页 例如: 1.澳门新葡京等赌博网站,获取流量,有人甚至会充钱参与赌…...

Android中实现滑动的7种方法

Android中实现滑动的7种方法前置知识Android坐标系视图坐标系触控事件---MotionEvent获取坐标的方法实现滑动的7种方法layout方法offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo和scrollByScroller属性动画ViewDragHelper参考前置知识 Android坐标系 Andro…...

【hadoop】介绍

目录 介绍 版本 优势 大数据技术生态体系 介绍 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 解决 存储和分析计算Google在大数据方面的三篇论文GFS --->HDFS Map-Reduce --->MR BigTable --->HBaseHadoop创始人Doug Cutting版本 Hadoop 三大发行版本&a…...

【C语言】有关的经典题型内含数组及递归函数题型讲解(入门适用)

C语音经典题型1. 在屏幕上输出9*9乘法口诀表2. 求10 个整数中最大值3. 计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值&#xff0c;打印出结果4. 编写程序数一下 1到 100 的所有整数中出现多少个数字95. 能把函数处理结果的二个数据返回给主调函数6. 实现一个函数&#xff0c;…...

MyBatis操作数据库

目录 MyBatis 功能架构 学习MyBatis 第一个MyBatis查询 1、创建数据库和表 2、搭建MyBatis开发环境 2.1、在项目中添加MyBatis框架 2.2、配置数据库连接信息 2.3、配置MyBatis中xml的保存路径&#xff08;规则&#xff09; 3、添加业务代码 3.1、创建实体类 3.2、构…...

Object.keys(obj)与Object.values(obj)的用法

语法 Object.keys(obj) 参数&#xff1a;要返回其枚举自身属性的对象 返回值&#xff1a;一个表示给定对象的所有枚举属性的字符串数组 传入对象&#xff0c;返回属性名 1 var obj {a:123,b:345}; 2 console.log(Object.keys(obj)); //[a,b] 处理字符串&#xff0c;返回索…...

关于ES6新特性的总结

目录1.let & const2.解构赋值3.模板字符串4.简化对象写法5.箭头函数6.函数参数的默认值设置7.rest参数8.扩展运算符9.SymbolSymbol特点创建SymbolSymbol使用场景Symbol内置值10.迭代器11.生成器12.Promise基本使用Promise封装读取文件Promise封装ajaxPromise.prototype.the…...

13. CSS 处理

提取 Css 成单独文件CSS 文件目前被打包到 js 文件中&#xff0c;当 js 文件加载时&#xff0c;会创建一个 style 标签来生成样式,加载一个页面的时候&#xff0c;先 html -> js -> css&#xff0c;会有页面闪屏现象&#xff0c;用户体验不好。应该是单独的 Css 文件&…...

One-hot编码

One-Hot 编码&#xff0c;又称一位有效编码&#xff0c;其方法是使用N位状态寄存器来对N个状态进行编码&#xff0c;每个状态都由他独立的寄存器位&#xff0c;并且在任意时候&#xff0c;其中只有一位有效。 例如&#xff1a; 自然状态码为&#xff1a;000,001,010,011,100,1…...

Java中的深克隆与浅克隆

浅克隆&#xff1a; 实现Cloneable接口即可实现&#xff0c;浅克隆只对象内部的基础数据类型&#xff08;包括包装类&#xff09;被克隆&#xff0c;引用数据类型&#xff08;负责对象&#xff09;会被使用引用的方式传递。 简单来说&#xff0c;就是浅克隆属性如果是复杂对象…...

如何使用MyBatis框架实现对数据库的增删查改?

目录&#xff1a;1.创建MyBatis项目以及如何配置2.MyBatis操作数据库的模式3.实现增删查改注意&#xff1a;在我们操作数据库之前&#xff0c;先要保证我们已经在数据库建好了一张表。创建MyBatis项目以及如何配置我们在创建项目的时候&#xff0c;引入MyBatis相关依赖配置数据…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...