Python Opencv轮廓常用操作代码实例解析


Posted in Python onSeptember 01, 2020

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: 目标图像

Python Opencv轮廓常用操作代码实例解析

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]报错?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中反射用法实例
Mar 27 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
python openCV自制绘画板
Oct 27 Python
聊聊python中的异常嵌套
Sep 01 #Python
理解Django 中Call Stack机制的小Demo
Sep 01 #Python
如何快速理解python的垃圾回收机制
Sep 01 #Python
Python Opencv图像处理基本操作代码详解
Aug 31 #Python
Python Matplotlib绘图基础知识代码解析
Aug 31 #Python
一些关于python 装饰器的个人理解
Aug 31 #Python
Python常用模块函数代码汇总解析
Aug 31 #Python
You might like
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
jqTransform美化表单
2015/10/10 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
初步解析Python下的多进程编程
2015/04/28 Python
python中as用法实例分析
2015/04/30 Python
Python检测网站链接是否已存在
2016/04/07 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
Python用字典构建多级菜单功能
2019/07/11 Python
小学毕业寄语大全
2014/04/03 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
七一党日活动总结
2014/07/08 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书