yolov8动态识别屏幕上的视频物体

需求效果:

需求:

        屏幕上播放视频,要求用yolov8识别出屏幕上正在播放的任意视频的物体。

思路:

思路展开:

根据上面流程图上代码:

1、选取截图区域

        1.1、设置截屏区域:

monitor = {"top": 0, "left": 0, "width": 1920, "height": 1080}

        1.2获取获取激活窗口:

def get_active_window_rect():
    hwnd = win32gui.GetForegroundWindow()
    rect = win32gui.GetWindowRect(hwnd)
    return {'top': rect[1], 'left': rect[0], 'width': rect[2] - rect[0], 'height': rect[3] - rect[1]}

2、MSS截屏:

sct = mss()
sct_img = sct.grab(monitor_temp)

3、转为numpy数组:

frame = np.array(sct_img)

4、转为BGR:

frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)

5、YOLOV8进行图片识别:

model = YOLO("yolov8n.pt")
results = model(frame)

6、输出到窗口:

cv2.imshow("YOLOv8 Detection", annotated_frame)

上完整的代码:

1、截取指定区域的屏幕代码:

import cv2
import numpy as np
from mss import mss
from ultralytics import YOLO

# 加载 YOLOv8 模型
model = YOLO("yolov8n.pt")

# 定义要截取的桌面窗口区域
monitor = {"top": 0, "left": 0, "width": 1920, "height": 1080}

# 创建屏幕截图对象
sct = mss()

while True:
    # 获取桌面窗口区域的截图
    sct_img = sct.grab(monitor)
    frame = np.array(sct_img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)

    # 使用 YOLOv8 进行识别
    results = model(frame)

    # 在帧上绘制检测结果
    annotated_frame = results[0].plot()

    # 显示结果
    cv2.imshow("Desktop Window with YOLOv8 Detection", annotated_frame)

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

cv2.destroyAllWindows()

1.1、上效果:

因为是固定区域截屏,所以效果不是很满意!

2、截取指定窗口的代码:

import cv2
import numpy as np
import win32gui
from mss import mss
from ultralytics import YOLO

# 加载 YOLOv8 模型
model = YOLO("yolov8n.pt")

def get_active_window_rect():
    hwnd = win32gui.GetForegroundWindow()
    rect = win32gui.GetWindowRect(hwnd)
    return {'top': rect[1], 'left': rect[0], 'width': rect[2] - rect[0], 'height': rect[3] - rect[1]}

# 获取激活窗口区域
monitor = get_active_window_rect()

# 创建屏幕截图对象
sct = mss()

while True:
    # 获取激活窗口区域的截图
    sct_img = sct.grab(monitor)
    frame = np.array(sct_img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)

    # 使用 YOLOv8 进行识别
    results = model(frame)

    # 在帧上绘制检测结果
    annotated_frame = results[0].plot()

    # 显示结果
    cv2.imshow("Active Window with YOLOv8 Detection", annotated_frame)

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

cv2.destroyAllWindows()

2.1、上效果

效果明显好多了!不过还可以继续优。

2.2、把一次获取窗口代码写到循环里面去,就可以动态获取窗口了

# 获取激活窗口区域
# monitor = get_active_window_rect()

# 创建屏幕截图对象
sct = mss()

while True:
    # 获取激活窗口区域的截图
    # 动态获取激活窗口区域
    monitor = get_active_window_rect()
    sct_img = sct.grab(monitor)

上效果:

        效果明显好多!还可以继续优化!这里就先到这里了!

### 使用YOLOv8进行屏幕按键识别 #### 创建主窗口并初始化环境 为了使用YOLOv8模型来进行屏幕按键的识别,首先需要设置好开发环境以及创建应用程序的主要界面。这里采用PySide6作为图形用户界面库。 ```python import sys from PySide6.QtWidgets import QApplication, QMainWindow, QLabel from PySide6.QtGui import QImage, QPixmap from PySide6.QtCore import QTimer ``` 接着定义`MainWindow`类继承自`QMainWindow`,用于承载整个GUI布局[^1]。 #### 加载YOLOv8模型 引入必要的模块并且实例化YOLOv8对象,指定权重文件路径以加载预训练好的模型。此操作允许后续调用该模型执行预测任务。 ```python from ultralytics import YOLO model = YOLO('path_to_your_weights/yolov8n.pt', task='detect') ``` 注意替换上述代码中的`'path_to_your_weights/yolov8n.pt'`为实际存储YOLOv8权重的位置[^2]。 #### 屏幕捕获与图像处理 通过Python第三方库如Pillow或mss获取当前显示器的内容,并将其转换成适合输入到YOLOv8网络的形式——即numpy数组格式的RGB图片。考虑到实时性的需求,可能还需要加入跳帧机制减少不必要的计算开销。 ```python import numpy as np from PIL import ImageGrab import cv2 def grab_screen(): screen = np.array(ImageGrab.grab()) frame = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) return frame ``` 对于每一帧抓取下来的图像,在送入模型之前应当调整尺寸至固定大小(比如640×640),以便于保持一致性和提高推理效率[^3]。 #### 执行检测过程 当准备好待测样本后就可以调用先前准备好的YOLOv8模型对其进行推断了。通常情况下返回的结果是一个列表,其中包含了所有被发现的对象及其边界框坐标、置信度分数等信息。 ```python results = model(frame) # 对单张图像frame进行预测 for result in results: boxes = result.boxes.cpu().numpy() for box in boxes: r = box.xyxy[0].astype(int) cv2.rectangle(frame, (r[0], r[1]), (r[2], r[3]), color=(0, 255, 0), thickness=2) ``` 以上代码片段展示了如何遍历每一个检测结果并在原始画面上绘制矩形标记出各个按键位置。 #### 显示最终效果 最后一步就是更新UI组件上展示的画面,让用户能够直观看到经过标注后的截图。可以通过周期性触发事件的方式不断刷新视图内的内容,确保始终呈现最新的状态。 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel(self) timer = QTimer(self) timer.timeout.connect(self.update_frame) timer.start(30) def update_frame(self): img = grab_screen() # 获取最新一帧 # 进行物体检测... results = model(img) for result in results: ... height, width, channel = img.shape bytesPerLine = 3 * width qImg = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() pixmap = QPixmap.fromImage(qImg) self.label.setPixmap(pixmap) ``` 这样就完成了一个简单的基于YOLOv8屏幕按键识别系统的搭建流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值