Python Opencv轮廓常用操作代码实例解析
作者:五月的白色铃兰 发布时间:2023-01-03 08:46:59
1.颜色空间转换
使用cv2.cvtColor(input_image ,flag),flag为转换类型
常用的转换类型有:
BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY
BGR和HSV的转换使用 cv2.COLOR_BGR2HSV
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
2.二值化
ret, dst = cv2.threshold(src, thresh, maxval, type)
src:表示的是图片源(灰度图)
thresh:表示的是阈值(起始值)
maxval:表示的是最大值
type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
返回值
ret:指定的thresh
dst: 目标图像
ret, dst = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)
3.查找并绘制轮廓
3.1 cv2.findContours(image, mode, method[, offset])
概述:
寻找一个二值图像的轮廓。注意黑色表示背景,白色表示物体,即在黑色背景里寻找白色物体的轮廓
参数:
image: 8位单通道图像。非零像素值视为1,所以图像视作二值图像
mode: 轮廓检索的方式
cv2.RETR_EXTERNAL: 只检索外部轮廓
cv2.RETR_LIST: 检测所有轮廓且不建立层次结构
cv2.RETR_CCOMP: 检测所有轮廓,建立两级层次结构。上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE: 检测所有轮廓,建立完整的层次结构
method: 轮廓近似的方法
cv2.CHAIN_APPROX_NONE: 存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE: 压缩水平,垂直和对角线段,只留下端点。 例如矩形轮廓可以用4个点编码
cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法
offset:(可选参数)轮廓点的偏移量,格式为tuple,如(-10,10)表示轮廓点沿X负方向偏移10个像素点,沿Y正方向偏移10个像素点
返回值:
contours: 轮廓点。列表格式,每一个元素为一个3维数组(其形状为(n,1,2),其中n表示轮廓点个数,2表示像素点坐标),表示一个轮廓
hierarchy: 轮廓间的层次关系,为三维数组,形状为(1,n,4),其中n表示轮廓总个数,4指的是用4个数表示各轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓的编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号
补充: 若想得到轮廓点的集合的列表,可使用
cnt = np.squeeze(contours[0])
3.2 cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]])
参数:
image: 需要绘制轮廓的目标图像,注意会改变原图
contours: 轮廓点,上述函数cv2.findContours()的第一个返回值
contourIdx: 轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓
color: 绘制轮廓的颜色
thickness:(可选参数)轮廓线的宽度,-1表示填充
lineType:(可选参数)轮廓线型,包括cv2.LINE_4,cv2.LINE_8(默认),cv2.LINE_AA,分别表示4邻域线,8领域线,抗锯齿线(可以更好地显示曲线)
hierarchy:(可选参数)层级结构,上述函数cv2.findContours()的第二个返回值,配合maxLevel参数使用
maxLevel:(可选参数)等于0表示只绘制指定的轮廓,等于1表示绘制指定轮廓及其下一级子轮廓,等于2表示绘制指定轮廓及其所有子轮廓
offset:(可选参数)轮廓点的偏移量
import cv2
img = cv2.imread('D:/2.jpg',1)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)contours,hierarchy = cv2.findContours(dst, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)cv2.imshow('img',img)
cv2.waitKey(0)
4.点与轮廓位置关系
此功能可查找图像中的点与轮廓之间的最短距离。当点在轮廓外时返回负值,当点在内部时返回正值,如果点在轮廓上则返回零
dist = cv2.pointPolygonTest(cnt, (100, 100), True)
检查(100,100)与轮廓(cnt)的距离
在函数中,第二个参数需要tuple类型;第三个参数是measureDist。 如果为True,则查找距离. 如果为False,则查找该点是在内部还是外部或在轮廓上(它分别返回+1,-1,0)
如果不需要到距离,请确保第三个参数为False,因为这是一个耗时的过程。因此,将其设为False可提供2-3倍的加速
5.直线拟合fitline函数
output = cv2.fitLine(InputArray points, distType, param, reps, aeps)
参数:
InputArray Points: 待拟合的直线的集合,必须是矩阵形式(如numpy.array)
distType: 距离类型。fitline为距离最小化函数,拟合直线时,要使输入点到拟合直线的距离和最小化。这里的距离的类型有以下几种:
cv2.DIST_USER : User defined distance
cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
cv2.DIST_L2: 欧式距离,此时与最小二乘法相同
cv2.DIST_C: distance = max(|x1-x2|,|y1-y2|)
cv2.DIST_L12: L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
cv2.DIST_FAIR
cv2.DIST_WELSCH
cv2.DIST_HUBER
param: 距离参数,跟所选的距离类型有关,值可以设置为0
reps,aeps: 第5/6个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2
返回值:
output:对于二维直线,输出output为4维,前两维代表拟合出的直线的方向,后两位代表直线上的一点。(即通常说的点斜式直线)
loc = np.array(loc)
output = cv2.fitLine(loc, cv2.DIST_L2, 0, 0.01, 0.01)
k = output[1] / output[0]
b = output[3] - k * output[2]#k[key]报错?
来源:https://www.cnblogs.com/zhangxiaoman/p/12390742.html
猜你喜欢
- matplotlib绘图库模块安装pip install matplotlib导入pyplot子模块import matplotlib.py
- 前言前端小伙伴们平常在开发过程中文件上传是经常遇到的一个问题,也许你能够实现相关的功能,但是做完后回想代码实现上是不是有点"力不从
- 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析yaml配置文件原理及用法,主要介绍主要介绍yaml语法、yaml存储
- 前提准备:1.使用python requests模块2.了解json3.zabbix api的具体调用建议先浏览一下官网先上代码:impor
- MySQL中SQL Mode的查看与设置MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql
- 前言一首歌热门了,参与评论的人也很多,这时无论好坏评论都来了,没有人控评得话,指不定乱七八糟但是自己有喜欢看评论,不想影响好心情,想看看精彩
- 本文实例讲述了php实现的验证码文件类。分享给大家供大家参考。具体如下:<?php/*** @file* @version 1.0*
- VueX浏览器刷新保存数据在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失。原因:
- 关于Python 黑魔法 metaclass 的两种极端观点:这种特性太牛逼了,是无所不能的阿拉丁神灯,必须找机会用上才能显示自己的 Pyt
- 现在,ORM框架、Web框架和配置都已就绪,我们可以开始编写一个最简单的MVC,把它们全部启动起来。通过Web框架的@decorator和O
- 本文实例讲述了Zend Framework教程之资源(Resources)用法。分享给大家供大家参考,具体如下:Zend_Applicati
- 自己写了玩的一个小脚本,百度图片下载import reimport osimport requestsimport hashlibdef d
- 用Python求解微分线性方程因为之前用matlab也编写过,所以前不久试着用python写,感觉之间互通点也蛮多的,易理解。题目:稀疏线性
- 1.算法描述:(1)共循环 n-1 次(2)每次循环中,如果 前面的数大于后面的数,就交换(3)设置一个标签,如果上次没有交换,就说明这个是
- 代码代码很简单,主要是为了熟悉Selenium这个库的函数,为后续的短信轰炸做个铺垫from selenium import webdriv
- 1、封装的理解封装(Encapsulation):属性和方法的抽象属性的抽象:对类的属性(变量)进行定义、隔离和保护分为私有属性和公开属性:
- 前言这篇文章主要是就在公司实习的时候,对SQL优化工作作出的一些整理。在公司实习的时候,导师分配了SQL慢查询优化的任务,任务是这样的:每周
- XHTML规范中有一条标准就是“每个XHTML标签都有一个结束标记”。那么对于HTML中原来不带结束标记的元素,则在该结束前加上“/”来关闭
- 扰动的鲁棒性在之前我们讨论权重衰减(L2正则化)时看到的那样,参数的范数也代表了一种有用的简单性度量。简单性的另一个有用角度是平滑性,即函数
- 用户登录验证脚本,Chkpwd.asp<% '=======用户登录验证脚本======= '