需求效果:

需求:

        屏幕上播放视频,要求用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)

上效果:

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐