1、学习目标
在Python中如何使用OpenCV查找轮廓和绘制轮廓。
2、使用的函数方法
轮廓是形状分析和物体检测和识别的有用工具。
函数从二进制图像中检索轮廓。
cv2.findContours()
cv2.drawContours()
3、程序
结果
程序中的函数方法讲解:
轮廓为将所有连续的像素点(沿着边界)连接在一起的曲线,这些像素有相同的颜色或者灰度。
(1)
寻找轮廓
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
参数:
image -寻找轮廓的图像;
mode -轮廓的检索模式:
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
method-为轮廓的近似办法:
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标
返回值:
轮廓本身(countours)
每条轮廓对应的属性(hierarchy)。
cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
每个轮廓是一个ndarray,每个ndarray是轮廓上的点的集合。
每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。
(2)
绘制轮廓
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
参数:
image - 目标图像
contours - 所有的输入轮廓,每个轮廓为点矢量 /点向量 形式,与findcontours中的返回值 contours 的列表list形式一致
contourIdx - 指定轮廓列表的索引 ID(将被绘制),若为负数,则所有的轮廓将会被绘制。
color - 绘制轮廓的颜色。
thickness - 绘制轮廓线条的宽度,若为负值或CV.FILLED则将填充轮廓内部区域
lineType - 线型/线的连通性
hierarchy - 层次结构信息,与函数findcontours()的hierarchy有关
maxLevel - 绘制轮廓的最高级别。
0,则绘制指定轮廓;
1,则绘制该轮廓和所有嵌套轮廓 ;
2,则绘制该轮廓、嵌套轮廓 /子轮廓和嵌套-嵌套轮廓 /孙轮廓
(该参数只有在层级结构时才用到)
offset - 按照偏移量移动所有的轮廓(点坐标)。
返回值:
经过函数处理后的图像image
获取表单中的数据 slot-scope = ‘scpope ’ 定义作用域插槽 使用: scope.row.xx=‘xx’ scope.row 固定写法< el-dialog :visible.sync=’ xx’ > 组件弹框清空表单 :@coles = ‘xx’ 给表单注册个coles 事件 弹窗被关闭时 就会调用..._什么是es6模块化
在编程中我们时不时会遇到一些需要产生一系列随机数的问题,在查找了一系列资料后,我就来分享一下rand函数的用法。 首先,rand函数需要用到头文件stdlib.h和time.h,不同的编译器所需的头文件可能不同,大家需要查找一下。在调用rand函数时,我们需要设置随机数种子,通俗来讲就是一系列自变量的值,不然它的默认值为1,即你产生的随机数都会相等,这时候就要用到srand函数,一般我们只需..._rand()函数怎么用c语言
一、前言本阅读笔记是在阅读BERT模型过程中觉得需要记录的笔记,也是自己的理解记录。如有错误,欢迎指出纠正讨论,谢谢!目前该篇仅记录BERT文章的前三章,也就是模型相关介绍,后面的实验以及讨论暂未看完,后期继续更新!博客中引用的图片全部来自于BERT原文:https://arxiv.org/pdf/1810.04805.pdf摘要部分摘要部分主要概括性的介绍BERT的主体:..._基于bert的文本分类阅读笔记有哪些
P1170 兔八哥与猎人今天来看一道水题。题目描述兔八哥躲藏在树林旁边的果园里。果园有M × N棵树,组成一个M行N列的矩阵,水平或垂直相邻的两棵树的距离为1。兔八哥在一棵果树下。猎人背着猎枪走进了果园,他爬上一棵果树,准备杀死兔八哥。如果猎人与兔八哥之间没有其它的果树,猎人就可以看到兔八哥。现己知猎人和兔八哥的位置,编写程序判断兔子所在的位置是否安全.输入输出格式输入格式: 第一行为n,表示有n
Serial收集器Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;JDK1.3.1前是HotSpot新生代收集的唯一选择;1、特点针对新生代;采用复制算法;单线程收集;进行垃圾收集时,必须暂停所有工作线程,直到完成;即会"Stop The World"..._parnew 什么时候使用
日前,华云数据凭借领先的技术优势以及在航空数字化转型领域的丰富经验,经中国航协理事长办公会议审议同意,成为中国航协本级会员。中国航协成立于2005年9月9日,是依据我国有关法律规定,经中华人民共和国民政部核准登记注册,以民用航空公司为主体,由企、事业法人和社团法人自愿参加组成的、行业性的、不以营利为目的的全国性社团法人。截至2021年8月,协会会员1893家,本级会员125家,分支机构会员1768家。行业主管部门为中国民用航空局。2009年和2015年两次被民政部评为全国5A 级社团组织(每次有效期为5年_中国航空运输协会帮助会员单位数字化转型
Index 目录索引写在前面1 VS的安装2 CUDA 的安装和配置2.1 CUDA的安装2.2 CUDA环境变量的配置2.3 检验CUDA环境变量的配置3 VS中CUDA的配置安装过程中可能遇到的问题情况1写在前面以前只是在 PyCharm 编译环境中调用 GPU 来运行程序,这篇文章将记录 VS 编译环境中如何使用 CUDA 调用 GPU 来运行程序。1 VS的安装如果要在VS中调用CUDA,需先按照VS编译环境,因为CUDA在安装的过程中会自动将相关文件安装至VS环境中,所以要先安装V_cuda vs
1、简介定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。拆分定义,总结特点: 1、不改变原类文件。 2、不使用继承。 3、动态扩展。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引...
在使用.9图片习惯性把它放到mipmap中引用,结果报错,然后发现把.9图片放到drawable中引用就没事,有点疑问,然后去as官网看了下,发现as在介绍mipmap时将drawable和mipmap对比了下,在使用同一分辨率的图片时,将图片放在mipmap可以将图片进行优化,主要在scale方面,同时使其占用的内存更小,这其实就是drawable和mipmap的区别,这样看来一张图片经过.9后..._cannot resolve symbol @mipmap/splash
#include <bits/stdc++.h>long long f(long long x,long long y,long long p){ if(y==0)return 1%p; else if(y%2==0){ long long temp=f(x,y/2,p); return temp*temp%p; } else { long long temp=f(x,y/2,p); return temp*temp%p*x%p; }}using namespa._递归快速幂
0、前提 windows: win7 x64 WinPcap版本:4.1.3 WinPcap开发包:4.1.2 目标:在VS2010中配置使用winpcap 获取目标计算机中安装的网卡列表1、下载 http://www.winpcap.org/下载winpcap安装包 和 开发包安装包安装完毕后,解压开发包到某个目录即可,开发包免安装。3、在VS2010中配置配置头...
IDEA springboot项目启动报错org.apache.catalina.core.ContainerBase : A child container failed during start出错起因解决思路解决方法出错起因笔者将一个springboot项目部分代码复制到另一个springboot项目后,运行报错“A child container failed during start”解决思路笔者在搜索众多关于本问题的解决方法后仍没有成功解决。但是初步找到了思路:就是从其他项目导入的代_idea中a child container failed during start