我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Ai实现FPS游戏自动瞄准 yolov5fps自瞄

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Ai实现FPS游戏自动瞄准 yolov5fps自瞄

大家好 我是毕加锁 (锁!)

今天来分享一个Yolov5 FPS跟枪的源码解析和原理讲解。代码比较粗糙 各位有什么优化的方式可以留言指出,可以一起交流学习。 


需要了解的东西和可能会遇到的问题
1.xy坐标点与当前鼠标的xy坐标点距离计算


2.获取窗口句柄,本文使用的是根据窗口名称获取句柄


3.推理方式:本文使用的是GPU(为啥呢?速度快噻,因为我3060显卡噻~)。


4.屏幕宽高获取和敌人坐标获取和计算哪个是最近的敌人并控制鼠标去敌人身上和头上。(为什么说是身体和头部呢,因为还有一个方式,就是只需要敌人身体坐标就可以计算得出敌人头部坐标)干货噢~


5.还有鼠标按键状态获取。


正文开始吧,我们就从头开始代码解析吧。
先来一个两个xy坐标的距离计算

class Point():    def __init__(self, x1, y1, x2, y2):        self.x1 = x1        self.y1 = y1        self.x2 = x2        self.y2 = y2class Line(Point):    def __init__(self, x1, y1, x2, y2):        super().__init__(x1, y1, x2, y2)    def getlen(self):        changdu = math.sqrt(math.pow((self.x1 - self.x2), 2) + math.pow((self.y1 - self.y2), 2))        return changdu


上面这段代码的使用方式如下

L1 = Line(x1, y1, x2, y2)  #传入两个xy坐标L1.getlen() #return出两个坐标点的直线距离


接下来直接上全代码解析 各位可以把类和方法分离出去

# 这里是导入依赖,需要这些库import mathimport sysimport timeimport torchimport win32apiimport win32conimport win32guifrom PyQt5.QtWidgets import QApplicationfrom pynput.mouse import Controllerimport mouse#这里这俩class就是文章上面说的那个传入两个坐标点,计算直线距离的class Point():    def __init__(self, x1, y1, x2, y2):        self.x1 = x1        self.y1 = y1        self.x2 = x2        self.y2 = y2class Line(Point):    def __init__(self, x1, y1, x2, y2):        super().__init__(x1, y1, x2, y2)    def getlen(self):        changdu = math.sqrt(math.pow((self.x1 - self.x2), 2) + math.pow((self.y1 - self.y2), 2))        return changdu#第一步:我们获取到某FPS游戏的窗口句柄hwnd = win32gui.FindWindow(None, "穿越火线")#这个方法是获取上面句柄窗口的窗口截图,用的是PyQt截图,有速度更快更好的方式的话可以换上#截图完毕后保存在根目录的cfbg.bmp文件def screen_record():    app = QApplication(sys.argv)    screen = QApplication.primaryScreen()    img = screen.grabWindow(hwnd).toImage()    img.save("cfbg.bmp")#这里就是调用我们那yolo模型来进行推理啦,我设置的是cuda,也就是英伟达的GPU,因为cpu太慢了。#如果自己的不能使用GPU推理的话把下面这两行改改,改成cpu的就可以了。device = torch.device("cuda")model = torch.hub.load('F:/yolov5-master', 'custom', 'F:/yolov5-master/yolov5n6.pt',                       source='local', force_reload=False)  # 加载本地模型# 这里是定义屏幕宽高[其实这俩就是游戏所对应的分辨率,比如:游戏里1920*1080这里就是1920*1080]game_width = 1024game_height = 768# 这边就是开始实时进行游戏窗口推理了#无限循环 -> 截取屏幕 -> 推理模型获取到每个敌人坐标 -> 计算每个敌人中心坐标 -> 挑选距离准星最近的敌人 -> 如果左键是按下状态则控制鼠标移动到敌人的身体或者头部(本文计算方式是移动到头部)while True:    # 截取屏幕    screen_record()    # 使用模型    model = model.to(device)    img = 'cfbg.bmp'     # 开始推理    results = model(img)    # 过滤模型    xmins = results.pandas().xyxy[0]['xmin']    ymins = results.pandas().xyxy[0]['ymin']    xmaxs = results.pandas().xyxy[0]['xmax']    ymaxs = results.pandas().xyxy[0]['ymax']    class_list = results.pandas().xyxy[0]['class']    confidences = results.pandas().xyxy[0]['confidence']    newlist = []    for xmin, ymin, xmax, ymax, classitem, conf in zip(xmins, ymins, xmaxs, ymaxs, class_list, confidences):        if classitem == 0 and conf > 0.5:            newlist.append([int(xmin), int(ymin), int(xmax), int(ymax), conf])    # 循环遍历每个敌人的坐标信息传入距离计算方法获取每个敌人距离鼠标的距离    if len(newlist) > 0:        # 存放距离数据        cdList = []        xyList = []        for listItem in newlist:            # 当前遍历的人物中心坐标            xindex = int(listItem[2] - (listItem[2] - listItem[0]) / 2)            yindex = int(listItem[3] - (listItem[3] - listItem[1]) / 2)            mouseModal = Controller()            x, y = mouseModal.position            L1 = Line(x, y, xindex, yindex)            # 获取到距离并且存放在cdList集合中            cdList.append(int(L1.getlen()))            xyList.append([xindex, yindex, listItem[0], listItem[1], listItem[2], listItem[3]])        # 这里就得到了距离最近的敌人位置了        minCD = min(cdList)        # 如果敌人距离鼠标坐标小于150则自动进行瞄准,这里可以改大改小,小的话跟枪会显得自然些        if minCD < 150:            for cdItem, xyItem in zip(cdList, xyList):                if cdItem == minCD:                    # 锁头算法:使用win32api获取左键按下状态,如果按下则开始自动跟枪                    if win32api.GetAsyncKeyState(0x01):                        # 控制鼠标移动到某个点:看不懂计算方式的话看文章下面讲解吧O(∩_∩)O                        win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, int(xyItem[0] - game_width // 2),int(xyItem[1] - (game_height - (xyItem[3] - xyItem[5])) // 2), 0, 0)                    break

好了,我们来讲解下这行代码
win32api.mouse_event(鼠标行为:这里用的是MOVE相对移动, x坐标,y坐标, 0, 0)
第一个参数,先设定鼠标的行为:使用相对移动,为什么不用绝对移动呢,因为绝对移动在游戏里是无效的
第二个参数,x轴相对移动的距离:敌人x坐标 - (屏幕宽度 / 2)
第三个参数,y轴相对移动的距离:敌人y坐标 - (屏幕高度 - (敌人最大y坐标 - 敌人最小y坐标) / 2)
第一第二个参数相对来说比较好理解,但是可能有人对于第三个y的相对移动的计算方式有点懵,我画了个图,希望可以看明白。


实例图   图比较简陋 勿喷


 

在其他fps游戏,我们只需要修改窗口名称参数和分辨率参数即可。

以上就是Yolov5 FPS跟枪的源码解析和原理讲解了 感谢大家支持

我是毕加锁 期待你的关注

 

来源地址:https://blog.csdn.net/weixin_69999177/article/details/125135969

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Ai实现FPS游戏自动瞄准 yolov5fps自瞄

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录