【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

news/2025/1/2 9:53:53/

介绍

本人机器学习小白,通过语言大模型+百度进行搜索,磕磕绊绊的实现了初步效果,能有一些锁头效果,但识别速度不是非常快,且没有做敌友区分,效果不是非常的理想,但在4399小游戏中爽一下还是可以的!。

思路

1.先通过yolov5实现对电脑屏幕的实时检测,只获取中心部分画面,减少其他人物的识别,提高识别速度
2.筛选只留下【person】的人物框
3.获取第一个框的坐标点,并计算出框的中上坐标点,以此粗略的当作人物的头部
4.操作鼠标定位的中心点
5.模拟鼠标左键点击,完成射击

代码

1.先下载github上yolov5的项目

git clone https://github.com/ultralytics/yolov5.git

2.在项目中添加test.py

import timeimport cv2
import mediapipe as mp
import  pyautogui
import  pydirectinput
import numpy as np
import tkinter as tk
import torch
import warningswarnings.filterwarnings("ignore", category=FutureWarning, module="torch.cuda.amp.autocast")root = tk.Tk()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
root.destroy()# 获取屏幕的尺寸
crop_width = 500
crop_height = 500
start_x = (screen_width - crop_width) // 2
start_y = (screen_height - crop_height) // 2# 加载预训练模型
model = torch.hub.load('./', 'custom', path='yolov5s.pt', source='local')def readScreen():# 初始化MediaPipe姿态检测对象mp_pose = mp.solutions.posepose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)while True:# 使用pyautogui进行屏幕截图,指定截图区域为屏幕左半边#screenshot = pyautogui.screenshot(region=(start_x, start_y, 500, 500))screenshot = pyautogui.screenshot(region=(start_x, start_y, crop_width, crop_height))# 将截图转换为OpenCV格式(BGR格式),因为mediapipe处理的图像通常为RGB格式,后续会进行转换frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)# 获取期望的缩小后显示窗口的宽度和高度(这里设置为原屏幕宽高的一定比例,可根据需求调整)display_width = int(screen_width * 0.4)  # 示例,可修改比例display_height = int(screen_height * 0.4)  # 示例,可修改比例# 计算缩放比例,保持图像宽高比进行缩放scale_width = display_width / frame.shape[1]scale_height = display_height / frame.shape[0]scale = min(scale_width, scale_height)# 缩放图像resized_frame = cv2.resize(frame, (int(frame.shape[1] * scale), int(frame.shape[0] * scale)))# 进行人体姿态检测# 定义锐化卷积核kernel = np.array([[-1, -1, -1],[-1,  9, -1],[-1, -1, -1]])# 假设frame是已经获取的游戏截图(BGR格式)sharpened_frame = cv2.filter2D(frame, -1, kernel)#results = pose.process(sharpened_frame)# 进行推理results = model(sharpened_frame)# 解析结果detections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, confidence, class]# 在截图上绘制检测结果for detection in detections:x1, y1, x2, y2, confidence, cls = detectionclass_name = model.names[int(cls)]if class_name == 'person':# 根据之前计算的缩放比例scale,对坐标值进行缩放调整scaled_x1 = int(x1 * scale)scaled_y1 = int(y1 * scale)scaled_x2 = int(x2 * scale)scaled_y2 = int(y2 * scale)# 计算矩形框中心点坐标(在缩放后的图像坐标体系下)center_x = (scaled_x1 + scaled_x2) // 2center_y = (scaled_y1 + scaled_y2) // 2offset_y = (scaled_y2 - scaled_y1) / 4# 将缩放后的坐标转换回原始屏幕坐标体系(考虑截图区域的偏移)screen_center_x = start_x + (center_x / scale)screen_center_y = start_y + (center_y / scale) - offset_y# 使用pyautogui将鼠标移动到计算出的屏幕坐标位置try:#pydirectinput.click(button='left', x=int(screen_center_x), y=int(screen_center_y))pydirectinput.moveTo(int(screen_center_x), int(screen_center_y+10))click_left_button()except pyautogui.FailSafeException:print("鼠标移动超出安全范围,可能无法正确定位。")except Exception as e:print(f"鼠标移动出现其他错误: {e}")#cv2.rectangle(resized_frame, (scaled_x1, scaled_y1), (scaled_x2, scaled_y2), (0, 255, 0), 2)#cv2.putText(resized_frame, f"{class_name}: {confidence:.2f}", (scaled_x1, scaled_y1 - 10),#cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)break#show(resized_frame)# 显示视频帧#cv2.imshow('Frame', frame)# 将处理后的帧写入输出视频文件if cv2.waitKey(1) & 0xFF == 27:  # 按ESC键退出breakcv2.destroyAllWindows()pose.close()def click_left_button():# 执行点击鼠标左键的操作print("点击鼠标")pydirectinput.mouseDown()time.sleep(0.05)pydirectinput.mouseUp()def show(frame):# 创建一个窗口,并设置为可调整大小和始终在最前端cv2.namedWindow('Pose Recognition Result', cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO | cv2.WINDOW_GUI_EXPANDED | cv2.WINDOW_AUTOSIZE)cv2.setWindowProperty('Pose Recognition Result', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)cv2.setWindowProperty('Pose Recognition Result', cv2.WND_PROP_TOPMOST, 1)cv2.imshow('Pose Recognition Result', frame)if __name__ == '__main__':readScreen()

效果图

在这里插入图片描述
在这里插入图片描述

后记

测试是使用的 4399 小游戏中的【火线精英】这个游戏,需要在360打开,还需要安装flush插件,然后打的基本也是人机,在满足这些前提下,可以爽一下,哈哈哈


http://www.ppmy.cn/news/1559500.html

相关文章

GitLab 停止中国区用户访问,为用户提供60天的迁移期

近日,全球知名的代码托管平台 GitLab 宣布了一个重大变化:将停止为中国大陆、香港及澳门地区的用户提供访问服务,建议用户访问授权国内的产品极狐 GitLab.cn。 极狐 GitLab.cn 是 GitLab 授权的独立中国公司,之前该公司还发生过举…

大模型应用技术系列(四): 为RAG应用设计的缓存RAGCache

前言 在之前的文章中,我们已经了解过一些Cache相关的内容:比如KVCache、PageAttention、GPTCache等。这些Cache基于推理特点或业务特点对关键数据进行Cache, 从而加速端到端应用的生成过程。本文将介绍一个最新的Cache:RAGCache,它是针对RAG应用的特点设计了一套分层的缓存…

视频里面的音乐怎么提取出来?工具分享和教程示例

在数字化时代,视频与音乐的结合已经成为一种常见的多媒体形式。有时,我们可能希望从视频中单独提取音乐,用于其他创作或个人欣赏。视频里面的音乐怎么提取出来?下面,我们将介绍几种简单且有效的方法来提取视频中的音乐…

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

10道JavaWeb常问面试题

说一说Servlet生命周期 servlet的生命周期是初始化(init)、服务(service)、销毁(destroy) 1.初始化(init):当第一次访问Servlet时调用init方法进行初始化,只…

Linux零基础速成篇二(理论+实操)

前言:本教程适合Linux零基础学习,也适合Linux期末考试的小伙伴,从头到尾理论与实操相结合,让你快速对Linux进行了解和掌握。 (后续再出一个题目总结,可以嘎嘎提分,避免挂科) 目录 …

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…

vue3配置测试环境、开发环境、生产环境

第一步:在src同级新建 .env.production 、.env.test 、.env.development文件 第二步:在文件中配置开发环境、生产环境、测试环境 // 开发环境 .env.developmentNODE_ENV developmentVUE_APP_MODE development outputDir dist_dev // 打出包的名称VUE_…