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