OpenCV 边缘检测
作者:法纳斯特 发布时间:2023-08-19 22:54:20
边缘在人类视觉和计算机视觉中均起着重要的作用。
人类能够仅凭一张背景剪影或一个草图就识别出物体类型和姿态。
其中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。
下面是原图像灰度图和边缘检测图像。
接下来,通过边缘检测图像找到方块的第一个顶点(上顶点)。
# 第一个顶点的高度,row为列表(代表每一行的像素值),max(row)获取列表中最大的像素值
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400
对图像高度大于400的行进行遍历(这样可以去除上方数字270以及小程序块的影响)。
np.nonzero()表示获取列表元素数值不为0的位置,第一个即为上顶点的高度值。
接下来获取上顶点的宽度值。
# 第一个顶点的宽度
x_top = int(np.mean(np.nonzero(canny_img[y_top])))
这里发现有好几个水平点,所以最后取平均值。
接下来对方块下顶点的位置进行确定。
为了跳过小白圈的影响,在上顶点高度的基础上加上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()
最后通过上下顶点的坐标,得到方块的中心点。
左图为边缘检测原图,右图为找到方块中心点并以中心点为圆心绘制圆形的图像。
/ 02 / 跳动实现
现在结合之前模板匹配获得到的小跳棋位置,计算两中心的距离。
勾三股四弦五,便能得到两个中心的距离了。
看下图,一目了然。
玩过跳一跳的应该都知道,对于不同的距离,我们需要按压的时间是不同的。
所以可以给距离和按压时间设置一个相关参数,此处设置为1.35。
对于我的手机简直完美匹配(与屏幕大小有关)。
最后通过adb命令完成一定的按压时间,完成「跳一跳」自动化。
总结
以上所述是小编给大家介绍的OpenCV 边缘检测,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://mp.weixin.qq.com/s?__biz=MzU4OTYzNjE2OQ==&mid=2247485367&idx=1&sn=c17df276ea6020e430b0be090ad563af&chksm=fdcb3091cabcb987b61b9fa229b13bc2f0e154da87d6b85597ab55b6d0071e3e0b7dafd2afb9&scene=21#wechat_redirect


猜你喜欢
- 数据库优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解才行。尽管对系统或应用系统的了解不多的情况下优化效果还不错,但是如果想优化的
- 区块链比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链。从技术上来看
- 我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑、字幕编辑、分离音频、视频音频混流等。又比如对音频文件的操作:音频
- 一、什么是字典树在自然语言处理中,字符串集合常用字典树存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字,从根节点往下的路径构
- 数据采集我们上一篇介绍了,如何采集电影评论,看看这个电影好不好看.今天,我们来采集大家熟悉的百度贴吧的排行榜。发送请求我们首先确定我们的目标
- 本文实例讲述了SESSION存放在数据库用法。分享给大家供大家参考。具体如下:<?php/*CREATE TABLE `ws_sess
- Promise手写Promise作为面试必考题,Promise的手写也是面试官必问的问题,所以对于Promise我们一定要了解透彻框架(fu
- 本文实例讲述了Python自定义函数实现求两个数最大公约数、最小公倍数。分享给大家供大家参考,具体如下:1. 求最小公倍数的算法:最小公倍数
- Timedelta转换为Int或Float方式Pandas处理import pandas as pddataSet['t']
- 在pycharm使用过程中,对于每次新建的python文件的时候,关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便。方法如下:1
- 数据库技术是计算机科学中发展最快的领域之一,数据库的诞生和发展给计算机信息管理带来了一场巨大的革命。数据库的诞生和发展给计算机信息管理带来了
- <script> function window.onload(){ if(location.href.indexOf('
- 目录简介环境要求:安装小试一下创建爬虫将请求头转为json格式使用简介feapder 是一款上手简单,功能强大的Python爬虫框架,使用方
- 安装报错类型,解决方案;1. 数据库连接报错mysqldb只支持python2,pymysql支持3,都是使用c写的驱动,性能更好# dja
- 使用循环神经网络(RNN)实现影评情感分类作为对循环神经网络的实践,我用循环神经网络做了个影评情感的分类,即判断影评的感 * 彩是正面的,还是
- 动态页面的模拟点击:以斗鱼直播为例:http://www.douyu.com/directory/all爬取每页的房间名、直播类型、主播名称
- Python字符串拼接的几种方法整理第一种 通过加号(+)的形式print('第一种方式通过加号形式连接 :' + '
- 看看效果图:效果图功能点:支持不限城市,不限地区(这个东西的实现..真心死磕了挺久) – 左右两边数据的同步地区一次性多选,若是选择了所有地
- 学习了Go语言后,打算利用最近比较空一点,写一个前端部署工具,不需要每次都复制粘贴的麻烦,我们希望再部署开始之前和部署结束后推送钉钉消息创建
- inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换,而且inet_pton和inet_nto