当前位置: 首页 > news >正文

基于YOLOv11与单目测距的实战教程:从目标检测到距离估算

引言

在计算机视觉领域,目标检测与距离估算的结合是自动驾驶、机器人导航等场景的关键技术。本文将以YOLOv8模型为核心,结合单目相机的几何模型,实现对视频中目标的实时检测与距离估算。代码参考自单目测距原理博客,并通过实践验证其可行性。


环境准备

依赖库安装

pip install ultralytics opencv-python numpy

模型准备

  • YOLOv11模型:下载预训练模型(如yolo11l.pt),可通过YOLO官方文档获取。
  • 视频文件:准备测试视频1.mp4,或使用摄像头实时采集。

核心代码解析

参数配置

f = 700            # 相机焦距(像素单位)
angle_a = 0        # 相机光轴与水平线的夹角(弧度)
camera_h = 1.7     # 相机离地高度(米)

参数说明

  • 焦距(f):决定图像缩放比例,需通过相机标定获取。
  • 相机高度(camera_h):直接影响测距精度,需精确测量。
  • 夹角(angle_a):若相机安装存在俯仰角,需校准此值。

YOLOv11目标检测

model = YOLO("F:/mot/models/YOLO11/yolo11l.pt")  # 加载模型
results = model.track(frame, persist=True)       # 实时检测与追踪
  • model.track()启用追踪功能,支持多目标持续跟踪。
  • results包含检测框坐标、置信度、类别ID等信息。

距离估算核心逻辑

w, h = np.abs(x1-x2), np.abs(y1-y2)  # 计算目标框高度
angle_b = np.arctan(h / f)           # 计算像素高度对应的角度
angle_c = angle_b + angle_a          # 总夹角# 两种距离公式对比
dis1 = camera_h / np.tan(angle_c)    # 简化公式
dis2 = (camera_h / np.sin(angle_c)) * np.cos(angle_b)  # 参考公式

公式对比

  1. 简化公式(dis1):基于相似三角形原理推导,计算更高效。
  2. 参考公式(dis2):考虑相机姿态的几何修正,理论上更精确。

输出示例

id:5  class: car 0.92 dis1: 12.345m  dis2: 12.340m
  • ID:目标追踪ID(若未启用追踪则为-1)
  • 类别:如car、person等
  • 距离:两种公式计算结果对比

实验分析与优化建议

误差来源探讨

  1. 相机标定误差:焦距(f)和安装高度(camera_h)的微小偏差会显著影响结果。
  2. 目标姿态假设:公式假设目标位于地平面,若目标悬浮(如无人机)会导致错误。
  3. 像素高度测量:目标框高度(h)受检测框精度影响,建议使用目标底部特征点替代。

改进建议

  1. 相机标定:使用棋盘格标定工具(如OpenCV的calibrateCamera)获取精准内参。
  2. 动态角度补偿:通过IMU传感器获取实时相机姿态(angle_a),提升动态场景精度。
  3. 深度学习优化:结合目标尺寸先验知识(如车辆平均高度)校正测距结果。

完整代码

import cv2
from ultralytics import YOLO
import numpy as np# 相机参数配置
f = 700
angle_a = 0
camera_h = 1.7# 加载YOLO模型
model = YOLO("F:/mot/models/YOLO11/yolo11l.pt")# 视频捕获
video_path = "1.mp4"
cap = cv2.VideoCapture(video_path)while cap.isOpened():ret, frame = cap.read()if not ret:breakresults = model.track(frame, persist=True)for result in results:boxes = result.boxes.xyxy.cpu().numpy()confidences = result.boxes.conf.cpu().numpy()class_ids = result.boxes.cls.cpu().numpy()for box, conf, cls_id, d in zip(boxes, confidences, class_ids, result.boxes):idx = int(d.id.item()) if d.is_track else -1x1, y1, x2, y2 = map(int, box)# 距离计算h = np.abs(y1 - y2)angle_b = np.arctan(h / f)angle_c = angle_b + angle_adis1 = camera_h / np.tan(angle_c)dis2 = (camera_h / np.sin(angle_c)) * np.cos(angle_b)# 绘制标注label = f"id:{idx} {model.names[int(cls_id)]} {conf:.2f} dis1:{dis1:.2f}m dis2:{dis2:.2f}m"cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)cv2.imshow('YOLO Tracking', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

结语

本文通过YOLOv11实现了目标检测与单目测距的融合应用,验证了基于几何模型的低成本测距方案可行性。实际部署中需注意:

  1. 使用专业标定工具提升参数精度;
  2. 针对特定场景(如车辆测距)优化目标高度先验;
  3. 结合滤波算法(如卡尔曼滤波)平滑距离输出。

后续可探索多传感器融合(如激光雷达+视觉)进一步提升精度,或尝试单目深度估计网络(如MiDaS)替代传统几何方法。

相关文章:

  • Java反射机制深度解析与实战应用
  • Linux中升级或者切换python版本
  • 数据集-目标检测系列- 孔雀 数据集 peacock >> DataBall
  • 华为云Flexus+DeepSeek征文 | 弹性算力实战:Flexus X实例自动扩缩容策略优化
  • [论文阅读] 系统架构 | 零售 IT 中的微服务与实时处理:开源工具链与部署策略综述
  • ROS2双目相机标定与测距全流程详解:从原理到实践
  • MemVid:信息存储的未来?创新还是“视频噱头”?
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 2. 摄像机标定
  • 蚂蚁国际计划在香港和新加坡推出稳定币
  • 【氮化镓】GaN HEMT器件中Ec-0.9eV缺陷位置识别
  • qt初识--02
  • 扣子数据库实战案例:搭建AI登记助手
  • 大数据学习(138)-Hive数据分析3
  • 部署http服务
  • 2025-06-13【api】阿里百炼api调用方法
  • Windows 提权工具(“Potato“ 系列)用法指南
  • 基于51单片机的温室植物生长环境监测系统
  • WPF将容器内的组件按比例缩放
  • Linux中shell编程的函数递归用法和脚本自动化讲解
  • Redis : set集合
  • 成都网站建设sm1010/新乡seo公司
  • 网站开发报价和开发周期/百度seo网站优化服务
  • 做翻译兼职的网站是哪个/最新国际新闻
  • 怎样做网站关键字/统计网站访问量
  • 网站做图分辨率是多少/免费发布推广平台
  • 网站营销建设方案/中山疫情最新消息