Yolov5实时屏幕截图检测报错,请求技术排查
问题排查与解决方案
核心问题分析
- 图像通道不匹配:mss截图输出的是BGRA四通道图像,而YOLOv5模型默认处理RGB三通道图像,直接传入会导致推理异常。
- Results对象无法直接显示:
model(img)返回的是YOLOv5封装的Results实例,不能直接作为cv2.imshow的输入,需要提取渲染后的可视化图像。
修改后的完整代码
import time import torch import cv2 import mss import numpy as np # 加载自定义模型 model = torch.hub.load('ultralytics/yolov5', 'custom', path='last_210_epochs_Size1280.pt') with mss.mss() as sct: # 选择要捕获的屏幕(mss monitors索引从1开始,1为主屏幕,2为副屏,按需调整) monitor = sct.monitors[1] while True: last_time = time.time() # 获取屏幕截图并转为numpy数组 img = np.array(sct.grab(monitor)) # 将BGRA格式转为YOLOv5需要的RGB格式 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB) # 模型推理 results = model(img_rgb) # 提取绘制好检测框的图像,转为OpenCV兼容的BGR格式 img_result = results.render()[0] img_result_bgr = cv2.cvtColor(img_result, cv2.COLOR_RGB2BGR) # 实时显示检测结果 cv2.imshow('Real-time Detection', img_result_bgr) print(f"fps: {1 / (time.time() - last_time):.2f}") # 按q键退出循环 if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break
关键修改点说明
图像格式适配:
- 用
cv2.COLOR_BGRA2RGB将mss截图转为模型支持的RGB格式,解决通道不兼容问题 - 推理后用
cv2.COLOR_RGB2BGR将模型输出的RGB图像转为OpenCV默认的BGR格式,确保显示正常
- 用
Results对象处理:
- 调用
results.render()会生成带检测框和标签的可视化图像列表,取[0]获取当前帧的渲染结果,这是cv2.imshow可直接接收的numpy数组
- 调用
屏幕索引校验:
- mss的
monitors列表中,索引1对应主屏幕,索引2对应副屏,确认你需要捕获的屏幕编号,避免因捕获空区域引发异常
- mss的
内容的提问来源于stack exchange,提问作者Nahuel Mel
相关产品推荐
相关产品推荐

