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程序的执行原理
Apr 11 Python
Python正则表达式使用范例分享
Dec 04 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
Python字符串格式化输出代码实例
Nov 22 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
python实现一个简单的并查集的示例代码
2018/03/19 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
药剂专业毕业生求职信
2014/06/24 职场文书
工资证明格式模板
2015/06/12 职场文书
2016公务员年度考核评语
2015/12/01 职场文书