《OpenCV计算机视觉》—— 图像轮廓检测与绘制
文章目录
- 一、轮廓的检测
- 二、轮廓的绘制
- 图像轮廓检测与绘制的代码实现
- 三、轮廓的近似
一、轮廓的检测
- 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程
- 注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255
- 轮廓检测所用到的函数为 cv2.findcontours(img, mode, method)
- 参数介绍:
- image:需要实现轮廓检测的原图
- mode:轮廓的检索模式,主要有四种方式:
- CV2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略
- CV2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级。
- CV2.RETR_CCOMP: 检索所有的轮廓,并建立一个两级层次结构,其中上面的一层为外边界,里面的一层为内孔的边界轮廓。
- CV2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。
- method:轮廓的近似方法,主要有以下两种:
- CV2.CHAIN_APPROX_NONE:存储所有的轮廓点。
- CV2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廊信息。
- 返回的参数:image,contours,hierarchy
- image:返回处理的原图(在 OpenCV 4.x 中这个返回值已经被移除)
- contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标(x,y)的形式储存在numpy数组中。
- hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next,Previous,First child,Parent]
- Next:与当前轮廓处于同一层级的下一条轮廓
- Previous:与当前轮廓处于同一层级的上一条轮廓
- First Child:当前轮廓的第一条子轮廓
- Parent:当前轮廓的父轮廓
二、轮廓的绘制
- cv2.drawContours()函数是用于在图像上绘制轮廓
- 参数介绍:cv2.drawContours(image, contours, contourIdx, color, thickness=None
lineType=None, hierarchy=None, maxLevel=None, offset=None)- image:要在其上绘制轮廓的输入图像(在原图中画)。
- contours:轮廓列表,通常由cv2.findContours()函数返回。
- contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。–> -1
- color:轮廓的颜色,以BGR格式表示。例如,(0,255,0)表示绿色。
- thickness:轮廓线的粗细,默认值为1。
- lineType:轮廓线的类型。默认值为cV2.LINE_8
- hierarchy:轮廓层次结构。通常由cv2.findContours()函数返回.
- maxLevel:绘制的最大轮廓层级。默认值为None,表示绘制所有层级。
- offset:轮廓点的偏移量。默认值为None。
图像轮廓检测与绘制的代码实现
import cv2# 读取图片
phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY) # 转换为灰度图# 阙值处理为二值(黑白图像)
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像轮廓 cv2.RETR_LIST --> 查找所有轮廓,且不建立等级关系
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 查看轮廓的层次结构
print(hierarchy)
# 查看一共有多少的轮廓
print(len(contours))# 绘制所有的轮廓
Contours_show = cv2.drawContours(phone, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)# 显示灰度图和在原图中绘出轮廓后的图
cv2.imshow('phone_gray', phone_gray)
cv2.imshow('Contours_show', Contours_show)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
- 结果如下

三、轮廓的近似
-
轮廓的近似是计算机视觉和图像处理中的一个常用技术。它可以帮助我们简化轮廓的形状,去除一些不必要的细节,同时保持轮廓的主要形状特征。
-
在OpenCV中,可以使用cv2.approxPolyDP()函数来近似一个轮廓。这个函数基于 Douglas-Peucker 算法,该算法通过迭代的方式简化轮廓的顶点集合,以生成一个近似于原始轮廓的多边形,但顶点数量更少。这在处理图像中的形状时非常有用,特别是当你想要去除轮廓上的小噪点或不必要的细节,同时保留其主要形状特征时。
-
参数解释:cv2.approxPolyDP(curve, epsilon, closed)
- curve:输入轮廓,通常是一个由点组成的 NumPy 数组,这些点定义了轮廓的形状。
- epsilon:近似的精度参数。它是原始轮廓到近似多边形之间的最大距离。较小的 epsilon 值意味着近似多边形将更接近原始轮廓,但可能会包含更多的顶点。较大的 epsilon 值会导致生成一个更简单的多边形,但可能会丢失一些细节。
- closed:一个布尔值,指定近似多边形是否应该是封闭的。如果为 True,则函数将确保近似多边形是封闭的,即第一个和最后一个顶点将相同。
-
返回值 approx 是一个新的 NumPy 数组,包含了近似多边形的顶点。
-
代码实现
import cv2# 读取图像 he = cv2.imread('he.png')# 转换为灰度图像 he_gray = cv2.cvtColor(he, cv2.COLOR_BGR2GRAY)# 应用阈值处理 ret, he_thresh = cv2.threshold(he_gray, 120, 255, cv2.THRESH_BINARY)# 查找轮廓 _, contours, hierarchy = cv2.findContours(he_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 创建一个新图像用于绘制轮廓 he_new = he.copy()# 遍历所有轮廓 for cnt in contours:# 轮廓近似# cv2.arcLength()函数用于计算轮廓的周长(近似的精度设置为周长的0.2%)epsilon = 0.002 * cv2.arcLength(cnt, True) # 可以调整epsilon的值以获得不同的近似精度approx = cv2.approxPolyDP(cnt, epsilon, True)# 绘制近似后的轮廓cv2.drawContours(he_new, [approx], 0, (0, 255, 0), 3)# 显示原始图像和带有轮廓的图像 cv2.imshow('Original Image', he) cv2.imshow('Image with Contours', he_new)# 等待任意键按下后关闭所有窗口 cv2.waitKey(0) cv2.destroyAllWindows()- 结果如下

- 由结果可以看出轮廓的近似结果就是一个近似于原始轮廓的多边行。
- 结果如下
相关文章:
《OpenCV计算机视觉》—— 图像轮廓检测与绘制
文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…...
Spark-Yarn模式如何配置历史服务器
在Spark程序结束之后我们也想看到运行过程怎么办? Yarn模式下,通过以下步骤配置历史服务器即可: mv spark-defaults.conf.template spark-defaults.conf修改spark-default.conf 文件,配置日志存储路径 spark.eventLog.enabled true spark.…...
Maven的安装
一、安装 压缩包解压完的目录如下所示(此处为绿色免安装版): (其余三个文件是针对Maven版本,第三方软件等简要介绍) 二、环境变量 前提: jdk最低版本为JAVA7(即jdk17)…...
iOS——APP启动流程
APP启动 APP启动主要分为两个阶段:pre-main和main之后,而APP的启动优化也主要是在这两个阶段进行的。 main之后的优化:1. 减少不必要的任务,2.必要的任务延迟执行,例如放在控制器界面等等。 APP启动的大致过程&#…...
LLM模型:代码讲解Transformer运行原理
视频讲解、获取源码:LLM模型:代码讲解Transformer运行原理(1)_哔哩哔哩_bilibili 1 训练保存模型文件 2 模型推理 3 推理代码 import torch import tiktoken from wutenglan_model import WutenglanModelimport pyttsx3# 设置设备为CUDA(如果…...
虚幻引擎VR游戏开发02 | 性能优化设置
常识:VR需要保持至少90 FPS的刷新率,以避免用户体验到延迟或晕眩感。以下是优化性能的一系列设置(make sure the frame rate does not drop below a certain threshold) In project setting-> (以下十个设置都在pr…...
Web应用监控:URL事务监测指标解读
监控易是一款功能强大的IT监控软件,它能够实时监控各种IT资源和应用的运行状态,确保业务的连续性和稳定性。在Web应用监控方面,监控易提供了URL事务监测功能,通过模拟用户访问流程,监测整个事务的执行过程和性能表现。…...
redis之缓存淘汰策略
1.查看redis的最大占用内存 使用redis-cli命令连接redis服务端,输入命令:config get maxmemory 输出的值为0,0代表redis的最大占用内存等同于服务器的最大内存。 2.设置redis的最大占用内存 编辑redis的配置文件,并重启redis服务…...
CMake/C++:一个日志库spdlog
项目仓库 GitHub - gabime/spdlog: Fast C logging library.Fast C logging library. Contribute to gabime/spdlog development by creating an account on GitHub.https://github.com/gabime/spdlog 知乎参考贴 https://zhuanlan.zhihu.com/p/674073158 先将仓库clone一下 然…...
rig——管理不同R语言版本的工具
在Python中,我可以用Conda去管理多个版本的Python,包括一些Python模块,因此想在R语言中也找一个类似的工具。 之前在Mac上,有一个名为 Rswitch 的R语言版本管理工具,可以管理不同版本的R以及相应的R包。 现在想在Win…...
Java内存模型详解
1. 引言 在Java中,内存模型是非常重要的概念,它涉及到线程之间如何共享数据以及保证数据的一致性。了解Java内存模型对于开发高质量的多线程程序是至关重要的。 本篇博客将详细介绍Java内存模型的概念、原则、规则以及相关的概念和术语。同时ÿ…...
空气能热泵热水器
空气能热泵热水器压缩机把低温低压气态冷媒转换成高压高温气态,压缩机压缩功能转化的热量为q1,高温高压的气态冷媒与水进行热交换,高压的冷媒在常温下被冷却、冷凝为液态。这过程中,冷媒放出热量用来加热水,使水升温变…...
计算机毕业设计选题推荐-消防站管理系统-社区消防管理系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
移动UI:新手指引页面,跟着指引不迷路。
移动端新手指引在提供用户引导、提升用户体验、提高用户留存率、促进功能使用和降低用户流失率方面都有积极的作用。 移动端新手指引在应用程序或移动网站中有以下几个作用: 1. 提供用户引导: 新手指引可以帮助用户快速了解应用程序或移动网站的功能和…...
数据库MySQL基础
目录 一、数据库的介绍 1.数据库概述 (1)数据的存储方式 (2)数据库 2.常见数据库排行榜 二、数据库的安装与卸载 1.数据库的安装 2.数据库的卸载 三、数据库服务的启动与登录 1.Windows 服务方式启动 (1&…...
AUTOSAR_EXP_ARAComAPI的5章笔记(3)
5.3.4 Finding Services Proxy Class提供类(静态)方法来查找“连接”的服务实例。由于服务实例的可用性本质上是动态的(因为它有一个生命周期),所以ara::com提供了如下两种不同的方法来实现“FindService ”: StartFindService是一个类方法,它在后台启…...
【Godot4.3】基于纯绘图函数自定义的线框图控件
概述 同样是来自2023年7月份的一项实验性工作,基于纯绘图函数扩展的一套线框图控件。初期只实现了三个组件,矩形、占位框和垂直滚动条。 本文中的三个控件类已经经过了继承化的修改,使得代码更少。它们的继承关系如下: 源代码 W…...
申万宏源证券完善金融服务最后一公里闭环,让金融服务“零距离、全天候”
在数字化转型的浪潮中,申万宏源作为金融行业的先锋,持续探索科技如何赋能金融服务,以提升企业效率并优化客户服务体验。面对日益增长的视频化需求,传统的图文形式已难以满足市场与用户的新期待。为了应对这一挑战,申万…...
无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。
智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…...
系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践
本章考点: 第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分)。在历年考试中,案例题对该部分内容都有固定考查,综合知识选择题目中有固定分值…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
