admin管理员组文章数量:1434502
基于yolov7的FPS游戏(csgo,cf,cfhd)自瞄开发
1.训练yolo识别人物导出pt文件
链接: yolov7训练自己的数据集-gpu版
2.使用win32进行屏幕截图和鼠标移动
3.使用导出的pt文件进行推理(pt文件将在完善后发出)
屏幕截图获取屏幕->检测目标的坐标->取中心点->计算距离获取最近的敌人坐标->移动鼠标到中心点
数据集整理后上传
鼠标移动到目标传入两个参数分别为鼠标距离人物中心点的x,y坐标距离
import win32gui, win32ui, win32con, win32api
m = PyMouse()
class Shu:def move(self,x,y):self.x=xself.y=ywin32api.mouse_event(win32con.MOUSEEVENTF_MOVE,self.x, self.y) #鼠标移动到(x,y)位置#m.click(self.x, self.y) #移动并且在(x,y)位置左击
利用pt文件推理过程
# 这里是导入依赖,需要这些库
import ctypes
import math
import time
import mss.tools
import torch
from pynput.mouse import Controller
from shubiao import Shuimport win32gui, win32ui, win32con, win32api
s=Shu()
# 传入两个坐标点,计算直线距离的
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):return math.sqrt(math.pow((self.x1 - self.x2), 2) + math.pow((self.y1 - self.y2), 2))# 加载本地模型
device = torch.device("cuda")
model = torch.hub.load('D:/AI/yolov7-main', 'custom','D:/AI/yolov7-main/weights/best.pt',source='local', force_reload=False)print(11111)
# 定义屏幕宽高
game_width = 2560
game_height = 1440rect = (0, 0, game_width, game_height)
m = mss.mss()
mt = mss.tools# 加载罗技鼠标驱动,驱动资源来自互联网# 截图保存def window_capture(filename): #此函数用于截图hwnd = 0 # 窗口的编号,0号表示当前活跃窗口# 根据窗口句柄获取窗口的设备上下文DC(Divice Context)hwndDC = win32gui.GetWindowDC(hwnd)# 根据窗口的DC获取mfcDCmfcDC = win32ui.CreateDCFromHandle(hwndDC)# mfcDC创建可兼容的DCsaveDC = mfcDC.CreateCompatibleDC()# 创建bigmap准备保存图片saveBitMap = win32ui.CreateBitmap()# 获取监控器信息MoniterDev = win32api.EnumDisplayMonitors(None, None)w = MoniterDev[0][2][2]h = MoniterDev[0][2][3]# print w,h #图片大小# 为bitmap开辟空间saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)# 高度saveDC,将截图保存到saveBitmap中saveDC.SelectObject(saveBitMap)# 截取从左上角(0,0)长宽为(w,h)的图片saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)saveBitMap.SaveBitmapFile(saveDC,filename)
# 这边就是开始实时进行游戏窗口推理了
# 无限循环 -> 截取屏幕 -> 推理模型获取到每个敌人坐标 -> 计算每个敌人中心坐标 -> 挑选距离准星最近的敌人 -> 则控制鼠标移动到敌人的身体或者头部
while True:print(22222)#a=time.time()#print(222)# 截取屏幕#screen_record()window_capture('myProjects/cfbg.png')# 使用模型model = model.to(device)# 开始推理results = model('myProjects/cfbg.png')# 过滤模型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:#print('newlist:', newlist)# 存放距离数据cdList = []xyList = []for listItem in newlist:# 当前遍历的人物中心坐标xindex = int(listItem[2] - (listItem[2] - listItem[0]) / 2)print(xindex)yindex = int(listItem[3] - (listItem[3] - listItem[1]) /2)print(yindex)mouseModal = Controller()x, y = mouseModal.positionL1 = Line(x, y, xindex, yindex)#print(int(L1.getlen()), x, y, xindex, yindex)# 获取到距离并且存放在cdList集合中cdList.append(int(L1.getlen()))xyList.append([xindex, yindex, x, y])# 这里就得到了距离最近的敌人位置了minCD = min(cdList)# 如果敌人距离鼠标坐标小于150则自动进行瞄准,这里可以改大改小,小的话跟枪会显得自然些if minCD<150: #建议删除此行开挂就要暴力 1111111111111111111111111111111111111111111111111111删除此行for cdItem, xyItem in zip(cdList, xyList):if cdItem == minCD:#print(cdItem, xyItem)print(int(xyItem[0] - xyItem[2]), int(xyItem[1] - xyItem[3]))s.move(int(xyItem[0] - xyItem[2]), int(xyItem[1] - xyItem[3]))#传入鼠标坐标和目标中心坐标的距离break
本文标签: 基于yolov7的FPS游戏(csgoCFcfhd)自瞄开发
版权声明:本文标题:基于yolov7的FPS游戏(csgo,cf,cfhd)自瞄开发 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1708430103a743885.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论