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程序设计入门(4)模块和包
Jun 16 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
Scrapy框架使用的基本知识
Oct 21 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
Python configparser模块应用过程解析
Aug 14 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
Python绘制散乱的点构成的图的方法
Apr 21 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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
php IP转换整形(ip2long)的详解
2013/06/06 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
js 动态文字滚动的例子
2011/01/17 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python绘制热力图示例
2019/09/27 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
大学生村官事迹材料
2014/01/21 职场文书
市级文明单位申报材料
2014/05/07 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
初中生物教学随笔
2015/08/15 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang