新手区 图片识别与跳一跳小游戏

Zhhh · 2018年01月02日 · 最后由 Zhhh 回复于 2018年01月13日 · 3994 次阅读
本帖已被设为精华帖!

游戏刚出来的时候就想到写个自动化,没想到第二天就出来了一大堆文章,真是感觉再不努力就要跟不上大家脚步了。

下面就来说说我的过程

使用工具:
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 长按时间

最后:
手动截图存在误差,有可能积累多就跳失败了,这方面可以与时俱进用机器学习来加强完善

成果图:

共收到 8 条回复 时间 点赞
思寒_seveniruby 将本帖设为了精华贴 01月02日 13:59
2楼 已删除
3楼 已删除

1、方格的大小随着分数的增大而且缩小,所以截图可能未必为全部覆盖到,所以可以看看能不能找到缩小的系数用于调整 2.05 这个系数
2、现在这个能跳多少分,我有个朋友直接用安卓按键精灵,跳了 3000+(我想删好友)
要不都搞一个比赛看谁写的工具跳得最远,哈哈

Zhhh #5 · 2018年01月02日 Author
terrychow 回复

大小会变,还有非常贴边的情况,增多了截图的量,7、800 没继续跑了😂 原则是能动就行。
打算把图片弄成二值化增加识别的效率
调整系数感觉跟台子的面积有关,不过还没好的方法判断,是可以想想,后期有个超小的台子 老死那里。。

Zhhh 回复

无数次死在 334,375,435,这几个点都是小桌子的点,其实各种自动化脚本修改还敌不过一个 post 请求对数据的修改😂 ,v2ex 上好多案例,楼主也可以去看看,看看有没有可以拓展一下思路滴

哎,和楼主比一下,我当年图形学白学了,有时间我自己也摸索一下!

哈哈~可不可以开源一下😍

Find_img 方法里的参数直接传图片路径?

看到了这个,想请问,自动化当中想通过你这种方法,来点击一些无法获取的控件或判断这个控件是否存在,不知道是否可行????

Zhhh #11 · 2018年01月13日 Author
jierong01 回复

可行,这个想法已经用在实践中,git 上也有不少类似的工具,对稳定的项目能够快速做出脚本

12楼 已删除
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册