OpenCV 边缘检测


Posted in Python onJuly 10, 2019

边缘在人类视觉和计算机视觉中均起着重要的作用。

人类能够仅凭一张背景剪影或一个草图就识别出物体类型和姿态。

其中OpenCV提供了许多边缘检测滤波函数,这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色。

不过这些滤波函数都很容易将噪声错误地识别为边缘,所以需要进行模糊处理。

本次的模糊操作使用高斯模糊(低通滤波器),最常用的模糊滤波器(平滑滤波器)之一,是一个削弱高频信号强度的低通滤波器。

低通滤波器,在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。

边缘检测则是使用OpenCV的Canny函数实现,算法虽然很复杂,但是代码却很简单。

5个步骤,使用高斯滤波器对图像去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双(double)阈值去除阳性(false positive)、分析所有的边缘及其连接,保留真正的边缘并消除不明显的边缘。

下面就来实现一下「跳一跳」的边缘检测,得以获取方块的中心位置。

/ 01 / 边缘检测

Canny边缘检测代码如下。

import cv2
import numpy as np
# 读取原图像
img = cv2.imread('game.png', 0)
# 显示原图像
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 400, 600)
cv2.imshow('img', img)
# 高斯模糊
img_rgb = cv2.GaussianBlur(img, (5, 5), 0)
canny_img = cv2.Canny(img_rgb, 1, 10)
# 显示边缘检测图像
cv2.namedWindow('canny', 0)
cv2.resizeWindow('canny', 400, 600)
cv2.imshow('canny', canny_img)
# 输出边缘检测图像的高和宽
H, W = canny_img.shape
print(H, W)

输出的图像高宽分别为1920和1080。

下面是原图像灰度图和边缘检测图像。

OpenCV 边缘检测

接下来,通过边缘检测图像找到方块的第一个顶点(上顶点)。

# 第一个顶点的高度,row为列表(代表每一行的像素值),max(row)获取列表中最大的像素值
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400

对图像高度大于400的行进行遍历(这样可以去除上方数字270以及小程序块的影响)。

np.nonzero()表示获取列表元素数值不为0的位置,第一个即为上顶点的高度值。

OpenCV 边缘检测

接下来获取上顶点的宽度值。

# 第一个顶点的宽度
x_top = int(np.mean(np.nonzero(canny_img[y_top])))

这里发现有好几个水平点,所以最后取平均值。

接下来对方块下顶点的位置进行确定。

OpenCV 边缘检测

为了跳过小白圈的影响,在上顶点高度的基础上加上80个像素大小。

然后往下方遍历,宽度值保持不变,直至找到像素值不为0的点。

便得到了方块的下顶点坐标。

# 跳过小白圈,然后遍历
y_bottom = y_top + 80
for row in range(y_bottom, H):
  if canny_img[row, x_top] != 0:
    y_bottom = row
    break
# 得到方块的中心点
x_center, y_center = x_top, (y_top + y_bottom) // 2
# 绘制以方块中心点为圆心的圆
cv2.circle(canny_img, (x_center, y_center), 33, (255, 0, 255), 2)
# 显示得到的图像
cv2.namedWindow('result', 0)
cv2.resizeWindow('result', 400, 600)
cv2.imshow('result', canny_img)
# 结束
cv2.waitKey(0)
cv2.destroyAllWindows()

最后通过上下顶点的坐标,得到方块的中心点。

OpenCV 边缘检测

左图为边缘检测原图,右图为找到方块中心点并以中心点为圆心绘制圆形的图像。

/ 02 / 跳动实现

现在结合之前模板匹配获得到的小跳棋位置,计算两中心的距离。

勾三股四弦五,便能得到两个中心的距离了。

看下图,一目了然。

OpenCV 边缘检测

玩过跳一跳的应该都知道,对于不同的距离,我们需要按压的时间是不同的。

所以可以给距离和按压时间设置一个相关参数,此处设置为1.35。

对于我的手机简直完美匹配(与屏幕大小有关)。

最后通过adb命令完成一定的按压时间,完成「跳一跳」自动化。

总结

以上所述是小编给大家介绍的OpenCV 边缘检测,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会

及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python爬取网站数据保存使用的方法
Nov 20 Python
python实现博客文章爬虫示例
Feb 26 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
Python实现的建造者模式示例
Aug 06 Python
对python多线程与global变量详解
Nov 09 Python
kafka-python批量发送数据的实例
Dec 27 Python
python操作日志的封装方法(两种方法)
May 23 Python
用python打印1~20的整数实例讲解
Jul 01 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python扫描线填充算法详解
Feb 19 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python使用Qt界面以及逻辑实现方法
Jul 10 #Python
用Python实现BP神经网络(附代码)
Jul 10 #Python
OpenCV 模板匹配
Jul 10 #Python
8种用Python实现线性回归的方法对比详解
Jul 10 #Python
Python实现计算对象的内存大小示例
Jul 10 #Python
Python画图高斯分布的示例
Jul 10 #Python
使用Python实现跳一跳自动跳跃功能
Jul 10 #Python
You might like
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python正则表达式知识汇总
2017/09/22 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
python模拟斗地主发牌
2020/04/22 Python
人力资源管理专业求职信
2014/07/23 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
golang 实现并发求和
2021/05/08 Golang
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技