我正在开发一个 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