基于Python PIL与ImageGrab.grab的人物检测功能集成问询
整合人物检测与框选到你的实时屏幕循环中
嘿,我来帮你把人物检测和框选功能无缝整合到你的现有循环里!咱们用YOLOv8来做实时检测——它速度快、准确率够,特别适合这种屏幕捕获的实时场景。
第一步:准备依赖
先安装需要的库:
pip install ultralytics numpy opencv-python pillow
第二步:修改你的代码
我会把检测和框选逻辑直接嵌入到你的循环里,关键是要在循环外提前加载模型(避免每次循环都重新加载拖慢速度),然后在每帧里运行检测并绘制框选。
修改后的完整代码如下:
import cv2 import numpy as np from PIL import ImageGrab import time from ultralytics import YOLO # 提前加载YOLO模型(nano版本,速度快适合实时) model = YOLO('yolov8n.pt') last_time = time.time() while(True): # 捕获屏幕区域 screen = np.array(ImageGrab.grab(bbox=(0,40, 1680, 1050))) # 将RGB格式的屏幕帧转为OpenCV的BGR格式(可选,YOLO也支持RGB) screen_bgr = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) # 运行人物检测(只检测人,类别ID是0) results = model(screen_bgr, classes=[0]) # 在帧上绘制检测框和标签 annotated_frame = results[0].plot() # 打印循环耗时 print('Loop took {} seconds'.format(time.time()-last_time)) last_time = time.time() # 显示带框选的画面 cv2.imshow('Detected People', annotated_frame) # 按q退出 if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break
关键细节解释
- 模型加载:把
YOLO('yolov8n.pt')放在循环外,这样只加载一次,大幅提升速度。如果需要更高准确率,可以换成yolov8s.pt(small版本),但速度会稍慢。 - 类别过滤:
classes=[0]指定只检测“人”这个类别(YOLO的类别ID里0对应person),避免检测其他无关物体。 - 帧格式转换:ImageGrab捕获的是RGB格式,OpenCV默认用BGR,所以转一下格式可以让YOLO的检测结果和OpenCV显示的颜色一致。
- 框选绘制:
results[0].plot()是YOLO内置的方法,自动帮你画出检测框、类别标签和置信度,不用自己手动写绘制逻辑,非常方便。
自定义调整方向
如果你想自己手动绘制框选(比如改框的颜色、粗细),可以替换annotated_frame = results[0].plot()为这段代码:
annotated_frame = screen_bgr.copy() for result in results[0].boxes: # 获取框的坐标、置信度和类别 x1, y1, x2, y2 = map(int, result.xyxy[0]) conf = result.conf[0] cls = result.cls[0] # 绘制矩形框 cv2.rectangle(annotated_frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制标签 label = f'Person {conf:.2f}' cv2.putText(annotated_frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)
这样你就能完全自定义框的样式啦!
内容的提问来源于stack exchange,提问作者Jennifer Miller
相关产品推荐
相关产品推荐

