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

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

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

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

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

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

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

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


class Point():def __init__(self, x1, y1, x2, y2):self.x1 = x1self.y1 = y1self.x2 = x2self.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 math
import sys
import timeimport torch
import win32api
import win32con
import win32gui
from PyQt5.QtWidgets import QApplication
from pynput.mouse import Controller
import mouse#这里这俩class就是文章上面说的那个传入两个坐标点,计算直线距离的
class Point():def __init__(self, x1, y1, x2, y2):self.x1 = x1self.y1 = y1self.x2 = x2self.y2 = y2
class 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 = 1024
game_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.positionL1 = 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(∩_∩)Owin32api.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跟枪的源码解析和原理讲解了 感谢大家支持

我是毕加锁 期待你的关注

Ai实现FPS游戏自动瞄准 yolov5fps自瞄相关推荐

  1. FPS游戏自动瞄准敌人头部?是如何实现的(三)准星算法与实现自动瞄准

    准星算法 知道了准星的变化规律: 1.准星水平位置摇摆角 正北是π,逆时针逐渐减小,正南是0,继续逆时针减小到正北为-π π和-π重叠 (正北方向Y轴逐渐增加,正东方向X轴逐渐增加) 2.准星高度位置 ...

  2. 【游戏逆向】FPS网络游戏自动瞄准漏洞分析以及实现二

    开始分析人物结构 由于人物结构是一个结构体,该结构体的起始地址为人物对象地址,所以,我们继续用CE的结构体分析工具去分析人物对象地址,也就是刚才的eax地址: 通过观察,我们立刻就得到了人物名称的偏移 ...

  3. 【游戏逆向】FPS网络游戏自动瞄准漏洞分析以及实现

    了解FPS游戏自瞄漏洞 经常玩游戏的朋友,应该知道FPS游戏,例如:穿越火线,逆战等等,他们的特点就是以第一人称视角进行操作人物,屏幕中间会有一个准星,通过准星瞄准敌人进行攻击以达到击杀效果和游戏体验 ...

  4. [原创]FPS网络游戏自动瞄准自瞄外挂漏洞分析以及实现

    0x0. 前言 来到论坛已经有一段时间了,目前大三学生,乐于分享知识,看到论坛招聘讲师的帖子,于是想发点文字,分享知识,不知道能不能申请精华. 新年刚刚过去,不知道大家亲戚走没走完,新的一年里,祝大家 ...

  5. 基于yolo5制作的AI识别FPS游戏自动化

    介绍 本项目为CF网游,人物角色识别定位模型,采用yolov5框架实现,仅供学习研究使用. 模型效果展示 开发思路与流程 思路 CV领域的目标检测模型已经非常成熟,特别是yolov5系列 为什么不是用 ...

  6. 基于yolov7的FPS游戏(csgo,cf,cfhd)自瞄开发

    1.训练yolo识别人物导出pt文件 链接: yolov7训练自己的数据集-gpu版 2.使用win32进行屏幕截图和鼠标移动 3.使用导出的pt文件进行推理(pt文件将在完善后发出) 屏幕截图获取屏 ...

  7. 基于yolov5实现FPS游戏自瞄,理论上通杀所有射击游戏

    1.参考大佬细致教学:Python Apex YOLO V5 6.2 目标检测 全过程记录_mrathena的博客-CSDN博客 [Yolov5]使用Ai实现FPS游戏自动瞄准 yolov5fps自瞄 ...

  8. 关于yolov5进行FPS游戏的目标检测,实现自动瞄准。

    yolov5进行FPS游戏的自瞄 前言 类似效果 main.py代码 使用方法 注意 完整链接↓ 前言 YOLOV5是一个基于视觉识别的开源项目,本人制作的目的是研究YOLO的应用,并非制作游戏外挂. ...

  9. 百万局对战教AI做人,技术解读FPS游戏中AI如何拟人化

    作者:johnxuan,腾讯 TEG 应用研究员 FPS 游戏 AI 是腾讯 AI Lab 的一大重要研究方向,其拟人化 AI 也在 FPS 手游<穿越火线-枪战王者(CFM)>春节期间上 ...

最新文章

  1. 检测IAT HOOK思路
  2. C# 连接MySQL错误给定关键字不在字典中”,下载最新mysql.dll文件即可
  3. bat文件名操作_Excel按文件名制作目录,你复制粘贴花一小时,同事只要十秒搞定...
  4. Elasticsearch 7.7.0 基本操作-基于 CMD 命令行
  5. java中常用的类——Math类
  6. dosbox进行debug调试教程
  7. [PED07]Feature Selection for Clustering:A Review聚类特征选择综述
  8. pcshare完美版
  9. 常州2021高考成绩查询,2021江苏常州高考选课分班情况(数据)
  10. c语言求数组中绝对值最小值,c语言中求绝对值的数学函数
  11. 华为 MA5800设备防盗
  12. 汉信码生成和识别SDK
  13. ceph web监控管理平台calamari
  14. 量子计算机可以制造意识吗,量子力学预测:意识可以决定物质,宇宙可能只是一道程序...
  15. (搞笑)经典!一些很彪悍的句子 !!!
  16. AD模数转换模块diy(AD9236/12位/80MSPS)
  17. SAP 发出商品业务配置
  18. vivado xilinx IOB = true的使用
  19. 00003 不思议迷宫.0009.9:命运之链
  20. Ubuntu无法连接网络?

热门文章

  1. kettle的下载安装以及问题点
  2. CentOS7系统编码
  3. Plecs电力电子仿真专业教程-第一季 补充课程 Plecs的安装教程与软件下载
  4. 步进电机的特点、选型方法以及型号参数说明
  5. mysql groupby字符串拼接
  6. 【Matlab作业】MATLAB语言基础
  7. ffmpeg推流摄像头数据至公网服务器
  8. 路径规划:粒子群算法
  9. rapidxml标识符 memory
  10. (转载)stdio.h、iostream.h和iostream的区别