本文详解如何使用yolov8对实时桌面截图进行目标检测,并通过pyqt5创建无边框、置顶、半透明的绘图窗口,在屏幕上直接绘制绿色边界框,实现轻量级、低延迟的gui级目标可视化。
本文详解如何使用yolov8对实时桌面截图进行目标检测,并通过pyqt5创建无边框、置顶、半透明的绘图窗口,在屏幕上直接绘制绿色边界框,实现轻量级、低延迟的gui级目标可视化。
在基于屏幕截图的目标检测场景中(如自动化UI测试、游戏辅助或桌面监控),仅执行推理并打印结果远远不够——关键在于将检测结果实时、直观、不干扰操作地呈现在屏幕上。由于输入非视频文件或摄像头流,传统cv2.imshow()无法满足“始终置顶+透明背景+不遮挡原桌面”的需求。本方案采用 PyQt5透明覆盖层(Overlay) + YOLOv8推理 + pyautogui全屏捕获 的组合架构,实现专业级视觉反馈。
✅ 核心实现逻辑
- 全屏捕获:pyautogui.screenshot() 快速获取当前桌面RGB图像,转为OpenCV兼容的BGR格式;
- YOLOv8推理:加载自定义训练模型(.pt),调用model(image)获得含坐标、类别、置信度的结果对象;
- 坐标提取:从results[0].boxes.xyxy中提取归一化/绝对坐标(注意:YOLOv8默认返回像素级绝对坐标,无需反归一化);
- 透明覆盖绘制:利用QWidget + Qt.WindowStaysOnTopHint | Qt.WA_TranslucentBackground 创建零干扰画布,重写paintEvent使用QPainter.drawRect()动态绘制矩形框。
? 完整可运行代码(已优化健壮性)
import sys
import cv2
import numpy as np
import pyautogui
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
from ultralytics import YOLO
class DetectionOverlay(QWidget):
def __init__(self, model_path: str, conf_threshold: float = 0.4):
super().__init__()
self.model = YOLO(model_path)
self.conf_threshold = conf_threshold
self.detections = [] # [[x1,y1,x2,y2], ...]
self._init_ui()
def _init_ui(self):
screen_size = pyautogui.size()
self.setGeometry(0, 0, screen_size.width, screen_size.height)
self.setWindowTitle("YOLOv8 Screen Overlay")
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.show()
def paintEvent(self, event):
painter = QPainter(self)
pen = QPen(Qt.green, 2, Qt.SolidLine)
pen.setCosmetic(True) # 确保线宽不随缩放变化
painter.setPen(pen)
for x1, y1, x2, y2 in self.detections:
painter.drawRect(int(x1), int(y1), int(x2 - x1), int(y2 - y1))
def update_detections(self, image: np.ndarray):
"""执行检测并更新内部坐标列表"""
results = self.model(image, conf=self.conf_threshold, verbose=False)
self.detections = []
if len(results) > 0 and len(results[0].boxes) > 0:
boxes = results[0].boxes.xyxy.cpu().numpy() # 转为numpy数组
self.detections = boxes[:, :4].astype(int).tolist()
def main():
MODEL_PATH = "C:/Users/toto/Desktop/DETECT/best.pt"
app = QApplication(sys.argv)
overlay = DetectionOverlay(MODEL_PATH, conf_threshold=0.4)
# 主循环:捕获→检测→刷新覆盖层
while True:
try:
# 截图(注意:pyautogui.screenshot() 返回PIL.Image)
pil_img = pyautogui.screenshot()
cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
# 更新检测结果
overlay.update_detections(cv_img)
# 强制重绘(避免闪烁)
overlay.repaint()
app.processEvents() # 处理GUI事件,保持响应
# 控制帧率(可选,避免CPU过载)
app.sleep(33) # ~30 FPS
except KeyboardInterrupt:
print("\nOverlay stopped.")
break
except Exception as e:
print(f"Error in loop: {e}")
continue
if __name__ == "__main__":
main()
⚠️ 关键注意事项
-
性能优化:全屏截图(尤其2K/4K)+ YOLOv8推理较耗时。建议:
- 使用model.predict(..., device='cuda')启用GPU加速;
- 降低截图分辨率(如缩放到1280×720再推理,坐标按比例映射回原尺寸);
- 设置合理conf_threshold(0.3~0.5)平衡精度与速度。
- 坐标兼容性:YOLOv8 results[0].boxes.xyxy 默认输出像素级绝对坐标(对应原始截图尺寸),无需额外归一化处理;若模型训练时使用了resize,需确保推理输入尺寸与训练一致。
-
权限与兼容性:
- Windows/macOS需允许Python程序捕获屏幕(系统设置中开启“屏幕录制”权限);
- Linux用户需安装scrot或改用mss库替代pyautogui.screenshot()以提升性能。
- 退出机制:当前示例通过Ctrl+C终止;生产环境建议添加热键监听(如pynput)或托盘菜单。
该方案摒弃了繁琐的窗口管理与图像叠加计算,以最小侵入方式将AI检测能力无缝融入桌面交互层,是构建智能桌面应用的理想起点。