轮廓查找与绘制

news2024/11/18 1:22:41

轮廓查找与绘制

1)什么是轮廓

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度,提取轮廓就是提取

这些具有相同颜色或者灰度的曲线,或者说是连通域,轮廓在形状分析和物体的检测和识别中非常有用。
注意事项:

①为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测

②查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量

中img.copy()

③在OpenCV 中,查找轮廓就像在黑色背景中找白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。

常用函数: cv2.findContours()-----查找轮廓cv2.drawContours()-----绘制轮廓

在这里插入图片描述
查找轮廓—cv2.findContours()
在这里插入图片描述
⚫image: 输入图像, 8位单通道图像(一般为二值图)
⚫contours: 检测到的轮廓, 每个轮廓存储为一个点向量, 即Point类型的vector表示
⚫hierarchy: 可选的输出向量, 包含图像的拓扑信息。其作为轮廓数量的表示, 包含了许多元素, 每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0]~hierarchy[i][3], 分别表示后一轮廓、前一轮廓、父轮廓、内嵌轮廓的索引编号, 如果没有对应项, 设置为负数
⚫mode: 轮廓检索模式, 取值如下:
cv2.RETR_EXTERNAL=0-----表示只检测最外层轮廓cv2.RETR_LIST=1------提取所有轮廓并放置在list中, 轮廓不建立等级关系cv2.RETR_CCOMP=2------提取所有轮廓并组织为双层结构cv2.RETR_TREE =3------提取所有轮廓并重新建立网状轮廓结构
⚫method: 轮廓的近似方法, 取值见图2
⚫offset: 每个轮廓的可选偏移量, 默认值Point()

在这里插入图片描述
CV_CHAIN APPROX NONE 连续存储所有的轮廓点,何两个相邻的点都是水平、垂直或者斜相的。也就是说

max(bs(x1-x2),ab (y2-y1))==1.

·CV CHAIN APPROXSIMPLE 压缩存储,对于水平,垂直或者斜向的线段,只会保存端点。比如一个四边形,只会存

储四个顶点。

CHAIN APPROXTC89L1,CV_CHAIN QPPROXTC89KCOS使用Teh-Chin链逼近算法中的一个

LINK RUNS与上述的算法完全不同,连接所有的水平层次的轮廓。

contours, hierarchy = cv2.findContours (mask, CV2.RETR EXTERNAL, CV2.CHAIN APPROX SIMPIE)

thresh,contours,hierarchy = cv2.findContours(thresh, CV2.RETR TREE,CV2.CHAIN APPROX SIMPIE)

绘制轮廓—cv2.drawContours()

在这里插入图片描述

⚫image: 目标图像, Mat类型对象即可
⚫contours: 所有的输入轮廓, 每个轮廓存储为一个点向量
⚫contourIdx: 轮廓绘制指示变量(索引), 若为负值, 则表示绘制所有轮廓
⚫color: 绘制轮廓的颜色
⚫thickness: 轮廓线条的粗细, 默认值1, 如果为负值, 则绘制轮廓内部, 可选宏 CV_FILLED
⚫lineType: 线条类型, 默认值8
⚫hierarcy: 可选的层次结构信息, 默认值noArray()
⚫maxLevel: 表示用于绘制轮廓的最大等级, 默认值INT_MAX
⚫offset: 可选的轮廓偏移参数, 默认值Point()
cv2.drawContours(img1, contours,-1, (0,0,255)2)

在这里插入图片描述

2)如何访问每一个轮廓

for i in range (0,len (contours)) :
  #cv2.drawContours (img,contours[i],-1,(0,255,0) ,5)
   cv2 .drawContours (img,contours ,i,(0,255,0) ,5)
for cnt in contours:
    cv2.drawContours (img,cnt,-1, (0,255,0) ,5)

3)如何访问每一个轮廓的所有点

for i in range (0,len (contours)) :
    for j in range (0,len (contours[il)) :
       cv2.drawContours(img,contours[il,j,(0,255,0) ,3)
for cnt in contours:
    for j in range(0,len (cnt)) :
         cv2 .drawContours (img,cnt,j,(0,255,0) ,3)

len(contours)------所有轮廓的个数
len(contours[i])------第i个轮廓所有点的个数
在这里插入图片描述

4)轮廓存储结构

mode: 轮廓检索模式,取值如下CV2.RETR EXTERNAL=0-----表示只检测最外层轮廓
Cv2.RETR LIST=1------提取所有轮廓并放置在list中,轮廓不建立等级关系
cv2.RETR CCOMP=2------提取所有轮廓并组织为双层结构
CV2.RETR TREE =3------提取所有轮廓并重新建立网状轮廓结构

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习系统编程No.20【进程间通信之命名管道】

引言: 北京时间:2023/4/15/10:34,今天起床时间9:25,睡了快8小时,昨天刷视屏刷了一个小时,本来12点的时候发完博客洗把脸就要睡了,可惜,看到了一个标题,说实话&#xff0…

.Net路由操作!!!!

什么是路由 问题 答案 路由是什么? 路由系统负责处理传入的请求并选择控制器和操作方法来处理它们。 路由系统还用于在视图中生成路由,称为传出的URL 路由有什么用? 路由系统能够灵活地处理请求,面不是将URL与Visual Studio…

MySQL(31)-ubuntu20.04-下安装mysql5.7

ubuntu20.04 下apt 默认安装的是8.0版本,如果要安装5.7版有如下3种方式: 1 下载 MySQL 二进制压缩包,解压并设置相关的参数即可运行 2 通过命令 apt install 进行安装,先下载 MySQL 5.7 对应的源,然后执行安装命令 ap…

5 分钟带你小程序入门 [实战总结分享]

微信小程序常常用 4 种文件类型 JS 文件 JS 在小程序中用于编写页面逻辑和交互效果,可调用 API 接口完成数据请求和处理,也可以使用第三方库和框架。 模块化编程:小程序中JS文件可以使用ES6的模块化语法,通过export和import来…

【vue3】关于watch与computed的用法看这个就ok

😉博主:初映CY的前说(前端领域) ,📒本文核心:watch()与computed的使用【vue2中watch|computed概念详解】,本文将介绍在vue3中怎么使用这两者技能 【前言】vue2当中有这两个技能,那么vue3中的watch与compute…

【云原生进阶之容器】第六章容器网络6.4.1--Flannel组网方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述

【Unity】用HDRI作为Unity的Skybox

教程:用HDRI作为Unity的Skybox 在Unity中,Skybox是用于创建环境背景的一种组件。使用高动态范围图像(HDRI)作为Skybox可以提供更真实的环境背景。以下是使用HDRI作为Unity Skybox的步骤: 步骤1:下载HDRI图…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展,如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性,避免过程中出现不必要的错误和漏洞,从而帮助企业更加稳健地自我发展。那么,一…

华为MatePad有什么好用的软件?

现如今伴随着办公方式的转变,人们正迫切地寻找能够顺应时代的“生产力新工具”,它既要能够满足线上/线下灵活切换,又要具备绘画、键入、远程沟通、跨终端联动等多种功能。 对大多数人来说,日常使用华为平板只是满足一下娱乐和生活…

【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

超详细从入门到精通,pytest自动化测试框架实战-fixture固件高级操作(十一)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 参数化fixture fix…

深度学习随笔

一、SPP的作用 解决了训练CNN需要输入图像尺寸一致的问题。 一个CNN可看作由卷积、池化、全连接层组成,由于全连接层的权重矩阵是一个固定值,因此输入全连接层的特征图的维度也必须固定。 SPP利用多尺度思想解决了上述问题,使得神经网络的训练…

2023/4/16总结

深刻的了解了网络编程的一些知识点 socket:套接字 ServerSocket 用来声明服务器 Socket用来声明客户端,其实也不然,在serversocket的accept的方法中,返回的是一个socket变量。我觉得更像一个接口,网络接口。 InternetAddress可以…

PaddlePaddle NLP学习笔记1 词向量

文章目录1.语言模型 Language Model1.1 语言模型是什么1.2 语言模型计算什么1.3 n-gram Language Model2.神经网络语言模型NNLM2.1 N-gram模型的问题3. 词向量3.1 词向量(word Embedding)word2vec 词向量训练算法3.2 如何把词转换为词向量?3.3如何让向量具有语义信息…

Windows 下部署Redis 主从模式+哨兵模式+JAVA连接方式

前言 之前项目需求部署redis高可用,走了很多弯路以及相关配置来回折腾浪费了很多时间,特地记录下。 主从模式:实现多台redis实例进行服务运行,并且数据相互同步; 哨兵模式:实现主服务器和从服务器进行监听…

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用 AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口,可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能,向 CAN 控制…

Spark编程基础-RDD

目录 1.何为RDD 2.RDD的五大特性 3.RDD常用算子 3.1.Transformation算子 1.map() 2.flatMap() 3.reduceByKey() 4 . mapValues() 5. groupBy() 6.filter() 7.distinct() 8.union() 9.join() 10.intersection() 11.glom() 12.gruopBykey() 13.sortBy() 14.sortByKey …

docker+docker-compose+nginx前后端分离项目部署

文章目录1.安装docker1.1 基于centos的安装1.2 基于ubuntu2.配置国内加速器2.1 配置阿里云加速器🍀 找到相应页面🍀 创建 docker 目录🍀 创建 daemon.json 文件🍀 重新加载服务配置文件🍀 重启 docker 引擎2.2 配置网易…

OJ系统刷题 第八篇

13415 - 津津的储蓄计划 时间限制 : 1 秒 内存限制 : 128 MB 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津…

计算机组成原理---第四章 指令系统

一、指令系统的发展与性能要求 指令系统的概述 指令就是要计算机执行某种操作的命令。可分为:①微指令,属于硬件;②机器指令,简称指令,完成算术逻辑操作;③宏指令,由若干条机器指令组成&#xf…