YOLO11教程,摄像头流媒体实时目标检测,保存为图片
发布于 作者:苏南大叔 来源:程序如此灵动~

yolo
是实时目标检测领域的代表性算法系列。它的重点是:大模型,也就是那个yoloXXX.pt
的文件。从几年前的yolov8
到现在的yolo11
,库文件ultralytics
是通用的。所以,ultralytics
目前主版本号是8
,但加载的已经是版本号为11
的大模型文件了。从市面上的反应来看,大家似乎对这个yolo11
并不认同,依然习惯性认同yolov8
。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,python@3.12.9
,ultralytics@8.3.111
,yolo@11
。本文将以摄像头为来源,利用yolo11
模型,进行实时目标检测,并通过一个完整的示例代码来展示目标检测的效果。本文代码的正确运行,需要测试机提供一个摄像头硬件作为视频来源。
yolo
在上一篇文字里面,苏南大叔对yolo
的发展历史,做了简要的回顾。可以参考:
更多官方内容,参考:
- https://www.ultralytics.com/zh
- https://github.com/ultralytics/ultralytics
- https://docs.ultralytics.com/models/yolo11/
依赖
需要先安装必要的文件依赖:
pip install ultralytics
pip install opencv-python
代码中引入YOLO
,用于模型加载和推理。
from ultralytics import YOLO
import cv2
import time
from pathlib import Path
模型加载
默认加载yolo11n.pt
这个最新的图片推理模型:
def load_model(model_path='yolo11n.pt'):
try:
model = YOLO(model_path)
return model
except Exception as e:
print("尝试加载默认模型 yolo11n.pt")
return YOLO('yolo11n.pt')
此函数实现了:
- 模型加载的错误处理
- 加载失败时自动切换到默认模型
- 返回加载好的
YOLO
模型
这个yolo11n.pt
文件,不用提前下载。本地存在则使用,不存在就会自动下载,很智能。实际下载地址:
准备工作
# 配置参数
conf_threshold = 0.25 # 置信度阈值
camera_id = 0 # 摄像头ID
save_dir = 'detections' # 保存图片的文件夹名称
save_path = Path(save_dir)
save_path.mkdir(parents=True, exist_ok=True)
关键参数说明:
conf_threshold
: 检测置信度阈值,低于此值的检测结果将被过滤。camera_id
: 摄像头设备号,通常内置摄像头为 0。(如果多个摄像头的话,就会出现其它id值了)save_dir
: 检测结果保存目录
实时检测循环
try:
model = load_model()
cap = cv2.VideoCapture(camera_id)
if not cap.isOpened():
raise Exception("无法打开摄像头")
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame, conf=conf_threshold)
这部分实现了:
- 摄像头初始化和错误处理
- 实时视频帧获取
- YOLO 模型检测
结果可视化
for result in results:
boxes = result.boxes
for box in boxes:
# 获取检测框信息
x1, y1, x2, y2 = map(int, box.xyxy[0])
conf = float(box.conf[0])
cls = int(box.cls[0])
class_name = model.names[cls]
# 绘制检测框
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
可视化处理包括:
- 获取检测框坐标和类别信息
- 绘制边界框
- 添加类别标签和置信度
标签位置优化
# 根据边界框位置决定标签位置
if y1 < label_h + 10: # 如果边界框太靠近顶部
# 在底部显示标签
label_y = min(y2 + label_h + 10, frame.shape[0] - 10)
else:
# 在顶部显示标签
label_y = max(y1 - 10, 10)
标签位置处理逻辑:
- 根据边界框位置自适应调整标签显示位置
- 确保标签不会超出图像边界
- 优化标签可读性
键盘事件
按 q
键退出程序,按 s
键保存当前检测结果。
key = cv2.waitKey(1) & 0xFF
if key == ord('q'): # 按q退出
break
elif key == ord('s'): # 按s保存当前帧
timestamp = time.strftime("%Y%m%d_%H%M%S")
save_file = save_path / f'detection_{timestamp}.jpg'
cv2.imwrite(str(save_file), frame)
print(f"图片已保存至: {save_file}")
保存功能实现:
- 使用时间戳生成唯一文件名
- 自动创建保存目录
- 提供保存成功提示
完整代码
识别的结果中,旁边都有个置信度。所以,也不能苛求识别的准确率是100%
。如下图所示:
在上图所示的这个检测结果里面,
person
的置信度是0.88
。donut
的置信度是0.31
(也就是说它也不十分确定这是个甜甜圈)。
完整代码如下:
结语
通过这个示例,苏南大叔实现了一个完整的实时目标检测应用。举一反三一下,如果这是一个监控场景的话,就可以循环results
,如果出现了person
,则自动保存图片。
更多苏南大叔的yolo
文章,可以点击:


