Python 帝国霸略 辅助工具 自动打野 测试版1

pip安装时,注意一下windows的权限,我系统是win10,安装的时候提示文件夹没有权限无法写入,我重新跟文件夹设置过权限的,先更改文件夹的所有者,然后改的权限

pip安装:

1、首先

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywin32
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow

2、然后,升级一下pip,然后再安装pyHook

  pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

python -m pip install --upgrade pip
pip install pyHook-1.5.1-cp37-cp37m-win_amd64.whl

3、接着

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyuserinput

 优化:

  用一张模板来匹配,正确率不是很高,准备改为用一个数据集(多张模板)来进行多次匹配,然后对匹配到的坐标进行去重(去相似点)

  截图:以前的截图方法不知道怎么的在win10上很慢,并且有时候打开是黑屏图片,所以就换了一个

版本一 实现的功能:

  目前仅做了自动刷野,且不完善,后期继续完善

  大致流程是:截取当前屏幕,自动识别野地,自动点击攻击,自动选择预设方案,自动攻击野地

后期再完善其他的吧,现在只是个demo而已

截屏代码:

from PIL import ImageGrab

im = ImageGrab.grab() #可以添加一个坐标元组进去
im.save('1.jpg')

代码-2020-01-19

import os
import cv2
import time
import numpy as np
import win32gui, win32ui, win32con
from matplotlib import pyplot as plt
from ctypes import windll
from PIL import Image
from pymouse import PyMouse
from PIL import ImageGrab











# 遍历模板数据集
# 获取匹配到的点(坐标)
# 去相似坐标


# 注意:不同屏幕分辨率下 按钮的位置
#   用图形识别按钮 + 缓存位置实现





# 全局变量
attackMonsterJpg='./template/btn/attackMonster.jpg'
armyAttackJpg='./template/btn/armyAttack.jpg'
armyPresetJpg='./template/btn/armyPreset.jpg'






# 图片识别返回坐标 参数:大图路径 小图路径 相似度(阈值)
def getPointByImg(bigImgPath, smartImgPath, threshold):
    arr=[]
    
    # 1. 读入大图(被搜索的图片) 和 小图(模板)    
    img_rgb=cv2.imread(bigImgPath)    
    img_gray=cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template=cv2.imread(smartImgPath, 0)    
    
    h, w=template.shape[:2]

    # 归一化平方差匹配
    res=cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)    

    # 返回res中值大于0.8的所有坐标
    # 返回坐标格式(col,row) 注意:是先col后row 常用的是(row,col)!!!
    loc=np.where(res >= threshold)

    # loc:标签/行号索引 常用作标签索引
    # iloc:行号索引
    # loc[::-1]:取从后向前(相反)的元素
    # *号表示可选参数
    for pt in zip(*loc[::-1]):
        right_bottom=(pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)
        # 中心点
        center_point=(int(pt[0]+w/2), int(pt[1]+h/2))
        arr.append(center_point)       
        left2=(center_point[0]-2,center_point[1]-2)
        right2=(center_point[0]+2,center_point[1]+2)
        cv2.rectangle(img_rgb, left2, right2, (0, 255, 0), 2)
        
    # 保存处理后的图片
    cv2.imwrite('img_screenshots_res.png', img_rgb)
    
    # 显示图片 参数:(窗口标识字符串,imread读入的图像)
    #cv2.imshow("test_image", img_rgb)
    return arr




# 判断坐标是否相似
def isLike(arr, obj):
    val=7
    for item in arr:
        if (abs(item[0]-obj[0])<val) and (abs(item[1]-obj[1])<val):
            return True
    return False



# 获取不相似的点
def getDiffPoint(arr,arr_res):
    for item in arr:
        if isLike(arr_res, item)==False:
            # 转换为真实坐标
            #x=item[0]+left_top[0]
            #y=item[1]+left_top[1]
            #arr_res.append((x,y))
            arr_res.append(item)
    return arr_res



# 描点
def paintPoint(bigImgPath, saveResImgPath, arr):
    # 1. 读入原图和模板    
    img_rgb=cv2.imread(bigImgPath)    
    img_gray=cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)    
    for center_point in arr:                     
        w=4
        left2=(center_point[0]-w,center_point[1]-w)
        right2=(center_point[0]+w,center_point[1]+w)
        cv2.rectangle(img_rgb, left2, right2, (0, 255, 0), 2)        
    # 保存处理后的图片
    cv2.imwrite(saveResImgPath, img_rgb)
    


# 获取单个点
def getSinglePoint(smartImgPath):
    bigImgPath='temp-single.jpg'
    threshold=0.7
    # 截屏
    im = ImageGrab.grab()
    im.save(bigImgPath)
    arr_res=[]
    arr=getPointByImg(bigImgPath, smartImgPath, threshold)# 匹配点
    if len(arr)==0:
        print('未匹配到相应的图形:'+smartImgPath)
        return None
    arr_res=getDiffPoint(arr, arr_res)# 取相似    
    return arr_res[0]




# 获取单个点(会自动寻找30次) 
def getSinglePointForLongTime(smartImgPath):
    for i in range(30):
        print('继续找点 当前次数 '+str(i+1))
        time.sleep(0.5)
        point=getSinglePoint(smartImgPath)
        if point!=None:
            return point
    print('长时间未找到点')
    return None
  
    
 
 
 # 模拟点击
def clickPoint(arr):
    m = PyMouse()
    for point in arr:
        print(point)
        time.sleep(1)
        
        # 点击野地
        print('准备 点击野地')     
        m.click(point[0], point[1])
        
        # 点击攻击
        print('准备 点击攻击')
        point_attack=getSinglePointForLongTime(attackMonsterJpg)
        if point_attack!=None:
            m.click(point_attack[0], point_attack[1])        
            
            # 点击预设
            print('准备 点击预设')
            point_armyPreset=getSinglePointForLongTime(armyPresetJpg)
            if point_armyPreset!=None:
                m.click(point_armyPreset[0], point_armyPreset[1])
                
                # 点击预设界面的攻击
                print('准备 点击预设界面的攻击')
                point_armyAttack=getSinglePointForLongTime(armyAttackJpg)
                if point_armyAttack!=None:
                    m.click(point_armyAttack[0], point_armyAttack[1])
            
       
            

 
 
 
# 找到点
def findPoint():    
    arr_res=[]
    path = "./template/monster/"
    files = os.listdir(path)
    bigImgPath='img_screenshots.jpg'
    saveResImgPath='img_screenshots_res.png'
    
    # 截图
    im = ImageGrab.grab()
    im.save(bigImgPath)
    
    for filename in files:
        threshold=0.6# 阈值
        smartImgPath=path+filename# 文件路径
        arr=getPointByImg(bigImgPath, smartImgPath, threshold)# 匹配点
        arr_res=getDiffPoint(arr, arr_res)# 取相似
    paintPoint(bigImgPath, saveResImgPath, arr_res)# 描点
    print(len(arr_res))
    print(arr_res)
    if len(arr_res)==0:
        print('未找到野')
        
    clickPoint(arr_res)






print('start')
try:
    #time.sleep(5)
    findPoint()    
    
    # test, find point, result pic: img_screenshots_res.png
    # 需要打开相应的测试图片
    #point=getSinglePoint(attackMonsterJpg)
    #point=getSinglePoint(armyPresetJpg)
    #point=getSinglePoint(armyAttackJpg)
    #print(point)
    
except Exception as e:
    print(e)
    f=open('1.txt','w')
    f.write(str(e))
    f.close()




print('10秒后自动关闭')
time.sleep(10)



# 窗口等待任意键盘按键输入 0为一直等待 其他数字为毫秒数
cv2.waitKey(0)

# 销毁窗口 退出程序
cv2.destroyAllWindows()
View Code

 图片的存放路径:

 

找点后的图片:

未完。。。

原文地址:https://www.cnblogs.com/guxingy/p/12206908.html