欢迎访问宙启技术站
智能推送

python微信跳一跳系列之如何实现棋子定位颜色识别

发布时间:2023-05-15 05:57:34

前言:

微信跳一跳是近期比较流行的一款玩法,也是许多学习编程的朋友们热衷的项目。其中,棋子的定位是跳一跳游戏中的关键技术,是实现自动跳跃的基础。而棋子的定位则需要用到颜色识别技术。本文将介绍如何使用Python实现对棋子颜色的定位识别。

一、需要的工具和库 

1. ADB工具 

ADB是Android Debug Bridge缩写,是一个Android调试工具,主要用于Android手机与电脑之间的数据通信、应用软件测试、APK文件的安装与卸载以及Android系统功能的控制等。

2. Python库 

- Python3:Python版本需要3.x以上。

- NumPy:用于对图像进行处理。

- OpenCV:网络上最流行的计算机视觉库。

- Wda:Facebook开源的WebDriver接口库,用于调用iOS的WebDriver agent来与设备交互。

3. 手机屏幕截图 

为方便演示,我们可以在手机上先截取一张跳一跳游戏截图,并传输到电脑上进行处理。

二、棋子颜色的定位识别 

1. 首先,我们需要处理游戏截图,仅保留棋子,使用的是OpenCV库中的Canny算法。该算法是由John Canny于1986年开发,是一个基于梯度的边缘检测算法,可以将一幅图像转换成矩阵形式,按照图像特征提取边缘。

import cv2

import numpy as np

# 读取棋子区域的图片

image = cv2.imread('./screenshot.png', 0)

# 执行canny算法

canny = cv2.Canny(image, 50, 150)

# 保存处理后的结果图像

cv2.imwrite('./canny.png', canny)

2. 接下来,我们需要计算棋子的位置和颜色。由于我们已经使用Canny算法将原始图像转换成黑白图像,我们需要找到棋子的轮廓,如下图所示:

import cv2

import numpy as np

# 读取处理后的图片

canny = cv2.imread('./canny.png')

# 查找图像中的轮廓

contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓

cv2.drawContours(canny, contours, -1, (0,255,0), 1)

# 保存处理后的结果图像

cv2.imwrite('./contours.png', canny)

找到轮廓之后,我们可以通过计算轮廓的重心(即质心)来得到棋子的位置。质心只需将轮廓数组传入,调用cv2.moments()函数就能得到。计算公式如下所示:

M = cv2.moments(cnt)

cx = int(M['m10']/M['m00'])

cy = int(M['m01']/M['m00'])

找到棋子的位置之后,我们需要计算棋子的颜色。通过分离棋子的RGB分量,将颜色转换成HSV空间,并设置颜色范围,即可完成颜色识别。HSV模型将颜色的明度(V)、饱和度(S)和色相(H)分开处理,便于我们对颜色的识别和处理。

import cv2

import numpy as np

# 定义颜色范围

lower = np.array([150, 43, 46])

upper = np.array([180, 255, 255])

# 读取处理后的图片

image = cv2.imread('./screenshot.png')

# 将RGB图像转换到HSV空间

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 使用inRange函数根据颜色范围过滤图像

mask = cv2.inRange(hsv, lower, upper)

# 查找图像中的轮廓

contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓

cv2.drawContours(image, contours, -1, (0,255,0), 1)

# 颜色识别结束后,将处理后的图片或最终结果输出

cv2.imwrite('./mask.png', mask)

cv2.imwrite('./contours.png', image)

到此为止,我们已经完成了棋子颜色的定位识别。根据识别结果,我们可以通过ADB命令来实现自动跳跃了。