opencv+yolov5定位Apex游戏人物

opencv+yolov5定位Apex游戏人物_第1张图片

搞了大半天

搜索了很久都没人写怎么搞,都是发布一个游戏中运行的视频,然后卖你源码,真的是累了。

大概流程就是加载yolo模型,然后循环截图桌面图片,把图片放到模型里面运行,获取框框的坐标,然后移动鼠标定位。搞出来之后倒是感觉挺简单的。

所需要的文件

Yolov5是官方的所有代码,yolov5s.pt也是官方训练的权重,官方的能检测出来人,毕竟是用人的数据训练的,但Apex人物太动画了,识别效果不是很好。

我没自己去训练Apex数据集,感觉标注太麻烦,有兴趣可以自己试试,运行文件我放在最后面,会写一些注释。

运行视频

图片中无论鼠标在什么位置,都会自动跳到那个位置,也可以自己把鼠标的高度再调高一些,这个无所谓,但在游戏中人物的图片没有这么大。

我自己设置的是检测到一个人之后,每过1s再进入下次循环,因为1s用来杀人。而且每次只判断一个为人的框框,鼠标并不能分身。

detection代码

import torch
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import cv2
from PIL import ImageGrab
import time
import pyautogui


# 加载本地yolov5模型,路径自己调
model = torch.hub.load('D:\\1 python job\\Yolov5', 'custom',
                       path='D:\\1 python job\\yolo_detect_desktop\\yolov5s.pt', source='local', device='0')
# 不设置这个可能会报agg错误
matplotlib.use('TkAgg')

while True:
    # 截图桌面图片
    image_array = np.array(ImageGrab.grab())
    # 获取框框的坐标
    bboxes = np.array(model(image_array[:, :, ::-1]).xyxy[0].cpu())

    for bbox in bboxes:
        conf = bbox[4]
        classID = int(bbox[5])
        # 判断是否为0,如果为0则是人,进入循环把人干掉,然后退出循环,寻找下一位
        if classID == 0:
            x0, y0, x1, y1 = int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3])
            # 移动鼠标
            pyautogui.moveTo(x0+(x1-x0)/2.0, y0+(y1-y0)/2.0)
            time.sleep(1)
            break

    if 0xFF == ord('7'):
        break

你可能感兴趣的:(计算机视觉,opencv,python,人工智能)