基于OpenCV与Canny算法的图像边缘检测及游戏自动化应用
本文详解OpenCV中Canny边缘检测算法的实现流程,涵盖高斯模糊去噪、梯度计算、非最大抑制及双阈值处理等关键步骤。通过Python代码实战,演示如何提取游戏画面中方块的中心坐标,并结合距离公式与ADB命令实现“跳一跳”游戏的自动化操作,为计算机视觉在移动端游戏中的应用提供具体案例。
边缘检测原理与Canny算法流程
边缘信息在人类视觉感知与计算机视觉系统中均占据核心地位。
人类具备仅凭背景剪影或简单草图即可准确识别物体类型与姿态的能力。
OpenCV提供了多种边缘检测滤波函数,其共同机制是将非边缘区域处理为黑色,而将边缘区域标记为白色或高饱和度的颜色。
然而,上述滤波函数容易将图像噪声误判为边缘,因此必须引入模糊处理以消除干扰。
本例采用高斯模糊(一种低通滤波器)进行预处理,这是最常用且有效的平滑滤波器之一,旨在削弱高频信号强度。
低通滤波器的原理是:当像素与其邻域像素的亮度差值低于特定阈值时,对该像素亮度进行平滑处理,主要用途包括去噪和图像模糊化。
边缘检测最终通过OpenCV的Canny函数实现,尽管该算法逻辑复杂,但代码实现相对简洁。
Canny算法包含五个核心步骤:首先利用高斯滤波器对图像进行去噪;其次计算图像梯度;接着在边缘应用非最大抑制(NMS);随后使用双阈值法剔除假阳性边缘;最后分析边缘及其连接关系,保留显著边缘并消除微弱边缘。
接下来,我们将通过边缘检测技术定位“跳一跳”游戏中方块的中心位置。
边缘检测代码实现与顶点定位
01 边缘检测实现
Canny边缘检测的具体代码实现如下。
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()函数获取非零像素值的位置索引,其中第一个索引即为上顶点的高度坐标。

确定高度后,进一步获取上顶点的宽度坐标。
下顶点定位与中心点绘制
# 第一个顶点的宽度
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的边缘检测技术,希望能为读者提供有益参考。如有任何疑问,欢迎留言交流,小编会及时回复。
衷心感谢大家对本站的支持!若本文对您有帮助,欢迎转载,请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













