首页 > 编程问答 >使用 YOLOv5 和 PyWin32 的游戏中鼠标移动和点击无法正常工作

使用 YOLOv5 和 PyWin32 的游戏中鼠标移动和点击无法正常工作

时间:2024-07-28 04:25:39浏览次数:10  
标签:python artificial-intelligence object-detection

我正在开发一个 AI 项目,使用 YOLOv5 模型来检测和射击 Aimlabs 游戏中的物体。该代码在游戏暂停时工作正常,但在游戏运行时无法准确移动鼠标,您知道如何解决此问题吗?

import cv2
import torch
import numpy as np
import mss
from PIL import Image
import win32api
import win32con
import time

# Load the YOLOv5 model
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')

# Set device (CPU or GPU)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device).eval()

# Screen capture settings
sct = mss.mss()
monitor = sct.monitors[1]

# Function to simulate mouse movement and click
def point_and_click(x, y):
    print(f"Moving to: ({x}, {y})")  # Debug
    # Move the mouse to the position
    win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, x * 65535 // win32api.GetSystemMetrics(0), y * 65535 // win32api.GetSystemMetrics(1))
    time.sleep(0.05)  # Brief pause before clicking to stabilize position
    # Perform the click
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
    print(f"Clicked at: ({x}, {y})")  # Debug

while True:
    # Capture the screen
    sct_img = sct.grab(monitor)
    img = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
    frame = np.array(img)

    # Perform inference
    results = model(frame)
    df = results.pandas().xyxy[0]

    if not df.empty:
        for index, row in df.iterrows():
            x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
            conf, cls = row['confidence'], row['name']
            center_x = (x1 + x2) // 2
            center_y = (y1 + y2) // 2
            
            # Draw bounding box and label
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(frame, f"{cls} {conf:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

            point_and_click(center_x, center_y)
    else:
        print("No objects detected.")

    cv2.imshow('YOLOv5 Object Detection', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

你代码中鼠标移动和点击不准确的原因很可能是 Aimlabs 等游戏使用 原始输入 或类似方法来处理鼠标输入。这意味着游戏绕过 Windows 常规的鼠标输入队列,直接从硬件读取鼠标数据,以获得更快的响应时间和更高的精度。

因此, win32api.mouse_event 函数,它模拟的是 Windows 消息队列中的鼠标事件,在游戏运行时可能无法正常工作。

为了解决这个问题,你可以尝试以下几种方法:

1. 使用 DirectInput:

DirectInput 是 DirectX 的一部分,允许你直接与输入设备(包括鼠标)交互,绕过 Windows 的消息队列。

  • 你可以使用 pydirectinput 库 (https://pypi.org/project/pydirectinput/) 来简化 DirectInput 的使用。
  • 确保 Aimlabs 没有禁用 DirectInput。

```python import pydirectinput

def point_and_click(x, y): pydirectinput.moveTo(x, y) pydirectinput.click() ```

2. 发送按键模拟鼠标移动:

一些游戏可能对模拟的鼠标移动事件不敏感,但仍然会响应键盘按键控制的移动。你可以尝试使用 win32api.keybd_event 函数发送模拟的按键事件来控制游戏中的准星移动。

```python import win32api import win32con import time

def move_crosshair(right=False, left=False, up=False, down=False, duration=0.01): if right: win32api.keybd_event(win32con.VK_RIGHT, 0, 0, 0) if left: win32api.keybd_event(win32con.VK_LEFT, 0, 0, 0) if up: win32api.keybd_event(win32con.VK_UP, 0, 0, 0) if down: win32api.keybd_event(win32con.VK_DOWN, 0, 0, 0) time.sleep(duration) # 释放按键 win32api.keybd_event(win32con.VK_RIGHT, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_LEFT, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_UP, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_DOWN, 0, win32con.KEYEVENTF_KEYUP, 0) ```

3. 使用游戏 API 或内存操作:

如果 Aimlabs 提供 API 或允许 mod,你可以直接使用它们来获取游戏内部信息和控制鼠标移动。另一种更复杂的方法是直接读取和修改游戏内存,但这需要对游戏内部工作原理有深入的了解,并且可能会违反游戏服务条款。

其他建议:

  • 检查 Aimlabs 设置: 确保游戏中没有禁用外部程序控制鼠标的选项。
  • 以管理员身份运行脚本: 确保你的 Python 脚本和 Aimlabs 都以管理员身份运行。

请注意,使用这些方法来与游戏交互可能会违反游戏服务条款,并导致你的帐户被封禁。请谨慎操作,并查阅 Aimlabs 的相关政策和规定。

标签:python,artificial-intelligence,object-detection
From: 78802211

相关文章

  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......
  • Python学习笔记45:游戏篇之外星人入侵(六)
    前言飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。子弹模块子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对......
  • 三种语言实现二分(C++/Python/Java)
    题目给定一个按照升序排列的长度为......
  • python+flask计算机毕业设计农场营销管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代农业的快速发展,农场管理日益复杂,尤其是营销环节,传统的销售模式已难以满足市场快速变化的需求。农场主面临着如何高效管理农资采购......
  • python+flask计算机毕业设计社区独居老人健康管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会老龄化的加速,独居老人群体日益庞大,成为社会关注的焦点。这一群体在享受独立生活的同时,也面临着健康监测不及时、生活照料缺失、医......