保姆级教程:用Python+Ultralytics YOLOv8实时识别你电脑屏幕上的任何物体(附完整代码)

张开发
2026/4/15 23:19:33 15 分钟阅读

分享文章

保姆级教程:用Python+Ultralytics YOLOv8实时识别你电脑屏幕上的任何物体(附完整代码)
零基础实现屏幕动态物体识别YOLOv8实战指南想象一下当你观看游戏直播时系统能自动标记画面中的装备和角色或是视频会议中实时识别参会者面前的物品——这一切只需几行Python代码就能实现。本文将带你从零开始用最简单的代码实现屏幕动态物体识别无需任何深度学习基础跟着做就能获得专业级效果。1. 环境配置与工具准备在开始编写代码前我们需要准备好Python环境和必要的库。推荐使用Python 3.8-3.10版本这些版本对各类AI库的兼容性最好。必备工具安装复制以下命令到终端执行pip install opencv-python numpy mss pywin32 ultralytics常见安装问题解决方案报错Microsoft Visual C 14.0 is required前往微软官网下载安装Build Tools for Visual StudioCUDA相关错误如果你没有NVIDIA显卡可以添加--no-cuda参数安装CPU版本权限不足在命令前添加--user参数或使用管理员权限运行验证安装是否成功import cv2 from ultralytics import YOLO print(所有依赖库已正确安装)2. 基础屏幕捕获与识别我们先从最简单的固定区域截屏开始。这段代码会持续捕获屏幕上指定区域的画面并用YOLOv8进行实时识别。完整实现代码import cv2 import numpy as np from mss import mss from ultralytics import YOLO # 初始化YOLOv8模型自动下载预训练权重 model YOLO(yolov8n.pt) # 使用nano版本速度最快 # 设置捕获区域左上角坐标和宽高 monitor {top: 100, left: 200, width: 800, height: 600} with mss() as sct: while True: # 捕获屏幕区域并转换为OpenCV格式 frame np.array(sct.grab(monitor)) frame cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 物体识别并标注 results model(frame) annotated_frame results[0].plot() # 显示结果 cv2.imshow(YOLOv8实时识别, annotated_frame) # 按Q键退出 if cv2.waitKey(1) 0xFF ord(q): break cv2.destroyAllWindows()关键参数调整指南参数说明推荐值top捕获区域上边距根据屏幕实际位置调整left捕获区域左边距根据屏幕实际位置调整width捕获宽度800-1200像素height捕获高度600-900像素yolov8n.pt模型选择可选s/m/l/x不同尺寸3. 动态窗口捕获进阶方案固定区域捕获的局限性很明显——当窗口移动时识别区域不会自动跟随。下面我们实现更智能的动态窗口捕获方案。3.1 获取活动窗口位置首先需要安装Windows系统依赖pip install pywin32改进后的动态捕获代码import cv2 import numpy as np import win32gui from mss import mss from ultralytics import YOLO def get_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] } model YOLO(yolov8n.pt) sct mss() while True: # 动态获取当前窗口位置 monitor get_window_rect() # 捕获识别流程 frame np.array(sct.grab(monitor)) frame cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) results model(frame) # 显示结果窗口标题显示FPS cv2.imshow(f动态识别 (FPS: {1/(time.time()-start_time):.1f}), results[0].plot()) if cv2.waitKey(1) ord(q): break cv2.destroyAllWindows()3.2 性能优化技巧当识别速度较慢时可以尝试以下优化方案1. 模型轻量化选择# 不同大小的模型对比 models { nano: yolov8n.pt, # 最快精度较低 small: yolov8s.pt, # 平衡型 medium: yolov8m.pt, # 精度更高 large: yolov8l.pt # 最精确但最慢 }2. 帧率控制优化# 添加帧率控制 frame_skip 2 # 每3帧处理1次 frame_count 0 while True: frame_count 1 if frame_count % frame_skip ! 0: continue # ...其余处理逻辑...4. 实用功能扩展基础功能实现后我们可以添加更多实用特性让项目更具价值。4.1 识别结果记录与分析将识别结果保存为CSV文件import csv from datetime import datetime def init_logger(): with open(detections.csv, w, newline) as f: writer csv.writer(f) writer.writerow([Timestamp, Object, Confidence, Position]) def log_detection(results): timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) for result in results: for box in result.boxes: cls model.names[int(box.cls)] conf float(box.conf) pos [round(x, 2) for x in box.xywh[0].tolist()] with open(detections.csv, a, newline) as f: writer csv.writer(f) writer.writerow([timestamp, cls, conf, pos])4.2 区域聚焦识别只关注屏幕特定区域的识别结果# 在while循环中添加区域过滤 x1, y1, x2, y2 100, 100, 400, 400 # 关注区域坐标 for result in results: for box in result.boxes: # 检查物体中心是否在关注区域内 cx, cy box.xywh[0][0], box.xywh[0][1] if x1 cx x2 and y1 cy y2: print(f发现关注物体: {model.names[int(box.cls)]})5. 常见问题与解决方案在实际使用中你可能会遇到以下典型问题问题1识别延迟明显降低输入分辨率修改捕获区域的width/height使用更小模型换用yolov8n.pt或yolov8s.pt启用GPU加速确保已安装CUDA版本的PyTorch问题2窗口捕获不完整# 添加窗口边框补偿某些系统需要 def get_window_rect(): hwnd win32gui.GetForegroundWindow() rect list(win32gui.GetWindowRect(hwnd)) rect[0] 8 # 左边框补偿 rect[2] - 8 # 右边框补偿 rect[3] - 8 # 下边框补偿 return { top: rect[1], left: rect[0], width: rect[2] - rect[0], height: rect[3] - rect[1] }问题3特定物体识别不准自定义训练收集特定物体的图片进行模型微调调整置信度阈值results model(frame, conf0.6) # 默认0.25在项目实际部署中我发现将捕获分辨率控制在720p以内、使用yolov8s模型、每2帧处理1次的配置能在大多数电脑上达到30FPS的流畅体验。对于需要更高精度的场景可以尝试yolov8m模型配合1080p分辨率但要注意这会显著增加GPU负载。

更多文章