游戏刚出来的时候就想到写个自动化,没想到第二天就出来了一大堆文章,真是感觉再不努力就要跟不上大家脚步了。
下面就来说说我的过程
使用工具:
python2.7
ADB
opencv
思路:
adb 截图-》opencv 识别图片坐标-》计算距离、长按时间-》adb 长按
长按时间:
小人---》目标方块的距离 与 长按屏幕的时间有一定的关系
在翻看社区的时候无意间看到个帖子上面讲到跟屏幕分辨率有关,大约是 *2.05 左右
这样就省去了琢磨比例关系的时间,就此谢过!
adb 截图:
adb shell screencap -p /sdcard/xxxx.png
当然 截图后要把图片处理一下:
去除颜色:
img=cv2.imread('xxx.png',cv2.IMREAD_GRAYSCALE)
去掉多余部分:
cv2.imwrite('home99.png',img[:740, :])
识别图片:
我用的是笨方法,手动截每个方块的特征点再用 opencv 去找坐标
截取的地方要一致(就是以正方体朝向我们的角为中心截图),所有方块都需要截同一个地方
不管圆的方的,位置大概都在那里,这样比较容易算出我们要跳到的目标坐标
当然,小人的特征图片也要截一张图
利用 opencv 找到坐标
识图代码:
def Find_img(background,target,threshold=0.95,method='cv2.TM_CCOEFF_NORMED'):
'''
background:背景图
target:想要在背景图中找出的图片
method:如果cv2.TM_CCOEFF_NORMED效果不好可以尝试:
['cv2.TM_CCOEFF','cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED',
'cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
'''
method = eval('%s'%method)
background = cv2.imread('%s'%background,0)
target = cv2.imread('%s'%target,0)
result = cv2.matchTemplate(background,target,method)
w, h = target.shape[::-1]
#匹配度loc
loc = cv2.minMaxLoc(result)[1]
if loc > threshold and loc <=1:
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = cv2.minMaxLoc(result)[2]
else:
top_left = cv2.minMaxLoc(result)[3]
bottom_right = (int(top_left[0] + w) , int(top_left[1] + h) )
#可以查看找到的结果
#cv2.rectangle(backIMG,top_left, bottom_right,50,3)
#cv2.imwrite(r'e:/res.png',backIMG)
x1,y1 = top_left
x2,y2 = bottom_right
centre_x = (x1+x2)/2
centre_y = (y1+y2)/2
return (centre_x,centre_y)
计算距离,然后乘系数 2.05 等于 adb 长按时间
adb shell input swipe 1 1 1 1 长按时间
最后:
手动截图存在误差,有可能积累多就跳失败了,这方面可以与时俱进用机器学习来加强完善
成果图: