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 相关文章推荐
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python实现猜单词小游戏
May 22 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
浅析Python 引号、注释、字符串
Jul 25 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
python实现canny边缘检测
Sep 14 Python
python迷宫问题深度优先遍历实例
Jun 20 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP类型约束用法示例
2016/09/28 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
js 作用域和变量详解
2017/02/16 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python中time库的实例使用方法
2019/10/31 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
销售高级职员求职信
2013/10/29 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python