Opencv轮廓检测运用与理解
目录
引入
基本理解
加深理解
①比如我们可以获取我们的第一个轮廓,只展示第一个轮廓
②我们还可以用一个矩形把我们的轮廓给框出来
③计算轮廓的周长和面积
引入
顾名思义,就是把我们图片的轮廓全部都描边出来
也就是我们在日常生活中面部识别的时候会有一个框,那玩意就是
基本理解
我们还是通过例子来基本的理解以下opencv是如何实现轮廓识别的
这是我们的原图像 test.png


实现代码
cv2.findContours(img,mode,method)
img:轮廓检索模式:
- 传入的图像
mode:轮廓检索模式:
- RETR_EXTERNAL :只检索最外面的轮廓;
- RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
- RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
- RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;(一般只用这种)
method:轮廓逼近方法
- CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,输出完整的轮廓(一般用这种)
- CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。(即只保留轮廓点)
返回的值:
contours 获取到的轮廓点 hierarchy层数(可以不用管)
cv2.drawContours(图像,轮廓,轮廓索引,颜色模式,线条厚度)
注意:会影响我们传入的原图像,记得定义一个临时图像传入进去
import cv2img = cv2.imread("test.png")
img = cv2.resize(img,(500,400))
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 阈值处理,让图像颜色只有2种颜色 提高准确性
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 进行轮廓处理
# cv2.findContours返回两个值
# contours 轮廓点(是个列表)
# hierarchy 层数(用不到)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 轮廓描边后会影响原图,所以我们定义一个临时的图片
temp_img = img.copy()
# 进行轮廓描边
# contours 获取到的轮廓点
# -1 表示的画出所有的轮廓,eg:0就表示我们列表中第一个轮廓
# (0, 0, 255) 表示我们用红色线条来绘画 bgr
# 2 表示线条粗细
res = cv2.drawContours(temp_img, contours, -1, (0, 0, 255), 2)cv2.imshow("res",res)
cv2.waitKey()
cv2.destroyAllWindows()
结果:

加深理解
除了最基本的用法,我们还有很多扩充的用法
①比如我们可以获取我们的第一个轮廓,只展示第一个轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 取出列表中第一个
con = contours[0]
# 绘制
res = cv2.drawContours(temp_img, con, -1, (0, 0, 255), 2)
# 展示
cv2.imshow("res",res)
我们可以看到,只出现了我们列表第一个的轮廓
![]()
②我们还可以用一个矩形把我们的轮廓给框出来
原图像:

实现代码:
img = cv2.imread('contours.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]# 返回我们要绘制的矩形特征
x,y,w,h = cv2.boundingRect(cnt)
# 绘制矩形
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show(img,'img')
x,y,w,h = cv2.boundingRect(cnt)
返回我们的x和y的坐标 以及宽和高
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
绘制我们的矩形
(x,y)表示我们的开始坐标
(x+w,y+h)表示我们的边
最后会自动把对边连接起来形成一个矩形
结果:

③计算轮廓的周长和面积
这个很简单,就是调用两个函数就能实现对应得功能
cnt = contours[0]
#面积
cv2.contourArea(cnt)
#周长,True表示闭合的
cv2.arcLength(cnt,True)
相关文章:
Opencv轮廓检测运用与理解
目录 引入 基本理解 加深理解 ①比如我们可以获取我们的第一个轮廓,只展示第一个轮廓 ②我们还可以用一个矩形把我们的轮廓给框出来 ③计算轮廓的周长和面积 引入 顾名思义,就是把我们图片的轮廓全部都描边出来 也就是我们在日常生活中面部识别的时候会有一个框,那玩意就…...
Java 8的新特性简单分享(后续有系列篇~敬请期待)
Java 8的新特性分享 Java 8是Java语言迎来的一次革命性的更新,引入了众多强大的新特性,使得Java开发变得更加现代化和便捷。在这篇博客中,我们将深入探讨Java 8的一些主要特性,并通过丰富的案例演示展示它们的用法。 1. Lambda表…...
计算机网络-计算机网络的概念 功能 发展阶段 组成 分类
文章目录 计算机网络的概念 功能 发展阶段总览计算机网络的概念计算机网络的功能计算机网络的发展计算机网络的发展-第一阶段计算机网络的发展-第二阶段-第三阶段计算机网络的发展-第三阶段-多层次ISP结构 小结 计算机网络的组成与分类计算机网络的组成计算机网络的分类小结 计…...
246.【2023年华为OD机试真题(C卷)】分月饼(动态规划-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-分月饼二.解题思路三.题解代码Python题解代码J…...
java大数据hadoop2.9.2 Linux安装mariadb和hive
一、安装mariadb 版本centos7 1、检查Linux服务器是否已安装mariadb yum list installed mariadb* 2、如果安装了,想要卸载 yum remove mariadb rm -rf /etc/my.cnf rm -rf /var/lib/mysql 才能完全删除 3、安装mariadb 在线网络安装 yum install -y mari…...
Docker部署微服务问题及解决
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Docker容器命令案例:Nginx容器修改,Redis容器持久化 📚订阅专栏:Docker 希望文章…...
Android: alarm定时很短时,比如500ms,测试执行mPowerManager.forceSuspend()后,系统不会suspend
参考文档: https://blog.csdn.net/weixin_35691921/article/details/124961404 Android: alarm定时很短时,比如500ms,然后执行mPowerManager.forceSuspend()后,系统不会suspend,原因分析: static int ala…...
一个简单好用的C语言单元测试框架-Unity
Unity简介: Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发,旨在简化嵌入式系统的单元测试。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里…...
ubuntu系统 vscode 配置c/c++调试环境
文章目录 1.安装插件2.目录结构3.cmake tools配置 1.安装插件 c/c插件 cmake cmake tools插件 2.目录结构 . ├── build ├── CMakeLists.txt ├── demo │ └── main.cpp ├── image.png ├── src │ ├── add.cpp │ └── add.hpp └── vsdebug.…...
算法练习-A+B/财务管理/实现四舍五入/牛牛的菱形字符(题目链接+题解打卡)
难度参考 难度:简单 分类:熟悉OJ与IDE的操作 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。 题目 A B1. A B - AcWing题库财务管理1004:财…...
XSS语句
XSS测试语句 在测试网站是否存在XSS漏洞时,应该输入一些标签如<,>输入后查看网页源代码是否过滤标签,如果没过滤,很大可能存在XSS漏洞。 <h5>1</h5> <span>1</span> <SCRIPT>alert(document.cookie)&l…...
AD导出BOM表 导出PDF
1.Simple BOM: 这种模式下,最好在pcb界面,这样的导出的文件名字是工程名字,要是在原理图界面导出,会以原理图的名字命名表格。 直接在菜单栏 报告->Simple BOM 即可导出物料清单,默认导出 comment pattern qu…...
linux 的nobody是什么用户? 对安全有没有影响?
目 录 一、前言:nobody是不是可疑用户? 二、Linux系统中的nobody用户? 二、有nobody用户存在,安全吗? 一、前言:nobody是不是可疑用户? 在前面一篇文章“Linux安全问题,如何查看哪…...
2024年华数杯国际数学建模B 光伏电(Problem B: Photovoltaic Power)完整思路以及源代码分享
背景 中国的电力构成包括传统的能源发电(如煤炭、石油和天然气)、可再生能源发电 (如水力发电、风能、太阳能和核能)和其他形式的电力。这些发电方式在满足中 国巨大的电力需求方面发挥着至关重要的作用。根据最新数据…...
在 Spring MVC 中,用于接收前端传递的参数的注解有以下几种
目录 RequestParam: PathVariable: RequestBody: RequestHeader: CookieValue: RequestParam: 用于获取请求参数的值。可以指定参数名称和默认值。示例代码: GetMapping("/users&q…...
K8s常用命令
查看集群各节点的状态 部署应用 删除一个service服务 查询service服务列表 kubectl get services 查看网络资源 kubectl get svc pod 创建一个namespace kubectl create namaspace namespace名称 创建一个pod 通常不需要创建pod 查看pod kubectl get pods kube…...
MySQL的基本操作
目录 序言 一、SQL语句(Structured Query Language) 1.1 SQL简介 1.2 SQL语句的分类 1.3 SQL语句的书写规范 二、数据库操作 2.1 查看库 2.2 创建库 2.3 切换库 2.4 删除库 三、MySQL字符集 3.1 MySQL字符集的分类 3.2 UTF8和UTF8MB4的区别…...
【b站咸虾米】chapter4_vue组件_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握
课程地址:【新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 四、vue组件 uni-app官网 …...
Java网络编程——UDP通信原理
一、TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCPUDP协议名称传输控制协议用户数据包协议是否连接面向连接的协议。数据必须要建立连接无连接的协议,每个数据报中都给出完整的地址信息,因此不需要事先建立发送方和接受方的连接是…...
Spring | Srping AOP (AOP简介、动态代理、基于“代理类”的AOP实现)
目录: 1.Spring AOP简介1.1 AOP简介1.2 AOP术语 2.动态代理2.1 JDK动态代理2.2 CGLIB代理 3.基于“代理类”的AOP实现3.1 Spring的通知类型3.2 ProxyFactoryBean ( 可通知.xml配置文件完成aop功能 ) 1.Spring AOP简介 1.1 AOP简介 Spring的AOP模块,是Spring框架体系…...
基于离线语音识别的智能化妆镜DIY:STM32控制与PWM调光调色温实战
1. 项目概述:当化妆镜遇上智能语音作为一名折腾过不少智能家居和嵌入式项目的老玩家,我最近完成了一个特别有意思的改造:把家里那面普普通通的化妆镜,升级成了能听懂人话的智能语音化妆镜灯。这玩意儿听起来好像有点“小题大做”&…...
51单片机计算器DIY:除了加减乘除,你的LCD1602和矩阵键盘还能这样玩?
51单片机计算器进阶指南:解锁LCD1602与矩阵键盘的隐藏玩法 当你在51单片机上成功实现了一个基础计算器后,是否想过这两个核心外设——LCD1602液晶屏和4x4矩阵键盘——还能玩出什么新花样?本文将带你超越简单的加减乘除,探索硬件模…...
如何高效下载B站视频:BiliDownloader终极使用教程
如何高效下载B站视频:BiliDownloader终极使用教程 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 想要轻松保存B站上的精彩视频内容…...
知识库搭建:从认知到实践的完整指南
知识库搭建:从认知到实践的完整指南一、先搞清楚:什么是知识? 数据 → 信息 → 知识 → 智慧 是经典的 DIKW 金字塔,描述了认知逐层升维的过程:层级核心定义关键特征回答的问题示例数据原始事实,raw facts离…...
Perplexity教育信息检索效率提升70%:从零到精通的4步优化法(附实测数据)
更多请点击: https://kaifayun.com 第一章:Perplexity教育信息检索效率提升70%:从零到精通的4步优化法(附实测数据) Perplexity 作为面向研究与教育场景的AI原生搜索引擎,其语义理解深度与引用溯源能力显著…...
GaussDB GDS 搭建完全指南:从安装到启动,一文搞定数据迁移服务
在进行 GaussDB 跨库数据迁移时,GDS(Gauss Data Service) 是实现外表迁移的核心组件。本文将手把手带你完成 GDS 的下载、安装、配置与启动,确保数据迁移通道畅通无阻。 📎 关联阅读:GaussDB GDS 外表迁移实…...
SharpCompress实战:一个方法搞定C#里ZIP压缩打包,附赠RAR/7Z解压和TAR.GZ创建教程
C#压缩解压全能手册:用SharpCompress玩转ZIP/RAR/7Z/TAR.GZ 在开发日志管理系统、文件上传模块或数据备份工具时,文件压缩解压功能就像空气一样不可或缺。但面对ZIP、RAR、7Z、TAR.GZ这些格式各异的压缩包,不少开发者都会陷入API选择的困境。…...
MFAPC实战:如何为你的Arduino或树莓派项目添加智能自适应预测控制?
MFAPC实战:为嵌入式项目打造轻量级智能控制引擎 在创客空间和物联网实验室里,我们常看到这样的场景:一位开发者盯着反复震荡的智能小车摇头叹气,或是面对总也调不准的温室控制系统抓耳挠腮。传统PID控制在这些复杂动态系统中往往…...
利用 AsyncOpenAI 与 asyncio.gather 实现批量问题的高效并发处理
1. 为什么需要异步处理批量问题? 想象一下你开了一家奶茶店,顾客排着长队点单。如果每次只服务一个顾客,等做完他的奶茶才接待下一位,队伍会越排越长。这就是同步请求的困境——每个查询必须等待前一个完成才能开始。当我们需要同…...
扩散模型在机器人控制中的多模态优化应用
1. 扩散模型在近似模型预测控制中的创新应用在机器人控制领域,模型预测控制(MPC)因其优秀的约束处理能力和优化性能而广受青睐。然而,传统MPC需要在线求解优化问题,计算成本高昂,难以满足高速实时控制的需求…...

