2. 基于相机图像的YOLO目标检测与2D框输出
任务目标
本案例实现基于相机图像的YOLO目标检测:加载预训练YOLOv8模型,对输入图像执行推理,输出每个目标的2D边界框坐标、类别标签与置信度,并将检测结果可视化保存。
环境依赖
- Python 3.8+
- ultralytics(YOLOv8官方库)
- OpenCV(图像读写与绘制)
安装命令:pip install ultralytics opencv-python
关键完整代码
import cv2
from ultralytics import YOLO
# 1. 加载预训练模型(首次运行自动下载权重)
model = YOLO("yolov8n.pt")
# 2. 读取输入图像
image_path = "input.jpg" # 替换为实际图像路径
image = cv2.imread(image_path)
assert image is not None, f"无法读取图像: {image_path}"
# 3. 执行推理
results = model(image, conf=0.5) # conf: 置信度阈值
# 4. 提取检测结果并绘制2D框
for result in results:
boxes = result.boxes # 检测框对象
for box in boxes:
# 边界框坐标(像素)
x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
# 类别ID与标签
cls_id = int(box.cls[0])
label = model.names[cls_id]
# 置信度
conf = float(box.conf[0])
# 绘制边界框与标签
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
text = f"{label} {conf:.2f}"
cv2.putText(image, text, (x1, y1 - 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
# 5. 保存结果
output_path = "output.jpg"
cv2.imwrite(output_path, image)
print(f"检测完成,结果已保存至: {output_path}")
print(f"检测到目标数: {len(results[0].boxes)}")
运行方式
- 将待检测图像命名为
input.jpg并放置于脚本同目录(或修改代码中的路径); - 执行脚本:
python yolo_detect.py; - 首次运行会自动下载
yolov8n.pt权重(约6MB),需保持网络连接。
验证方法
- 通过条件:程序正常退出,控制台输出检测到的目标数量;
- 打开
output.jpg,确认图像中车辆、行人等目标被绿色框标出,框上方显示类别名称与置信度(如person 0.87); - 若图像中目标未被检测或框位置明显错误,可降低
conf阈值(如改为0.25)后重试。
预期输出示例
对于一张包含2辆车和1个行人的典型街景图像,控制台输出:
检测完成,结果已保存至: output.jpg
检测到目标数: 3
输出图像中对应位置出现3个绿色边界框,分别标注car 0.92、car 0.88、person 0.79等标签(具体置信度随输入图像变化)。
常见问题
- 模型下载失败:手动下载
yolov8n.pt放入脚本目录,代码会自动加载本地权重; - 检测结果为空:图像中目标过小或遮挡严重时可能漏检,降低
conf至0.25或换用yolov8s.pt(精度更高但速度稍慢); - GPU不可用:默认自动使用CPU推理,无需额外配置。