什么是相机模型?又如何实现单目测距?详细公式推导!

作者 | Misaka  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/626913010

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心技术交流群

本文只做学术分享,如有侵权,联系删文

1:相机模型

坐标系

相机模型中存在4种坐标系,像素坐标系,图像坐标系,相机坐标系,世界坐标系;相机坐标系一般以相机光心作为原点 ,光心在成像平面的投影即图像坐标系的中心,也就是图像坐标系的原点 o ,连接图像坐标系原点和光心形成光轴 。

87ac2a2f6d981c32db4a2138ea1c745d.png
图片出处:https://blog.youkuaiyun.com/qq_32335687/article/details/100130861

世界坐标系转换为相机坐标系:通过坐标系旋转平移实现,世界坐标系分别绕X/Y/Z三轴旋转,再平移。

以绕Z轴旋转为例:

e3dc9ab878d02b688e324658901271da.png
图片出处:https://blog.youkuaiyun.com/LINEAR1024/article/details/104956774
1affba1ca1e7ebd3435838edc1dc7504.png

可得绕 Z 轴旋转 :

6e2342bba3acfa8fa32d05f8d7b6ed9f.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

同理绕 Y 轴旋转 :

d45c9fd05b802c3da52dc795ab29778e.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

同理绕 X 轴旋转 :

8fbb0c9338f2c8528c752297d27c1f51.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

旋转矩阵:R=

566cf876b2682c606069decf1c22336f.png 51c687dd72b0f8459a7c4dfeda2e5c97.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

相机坐标系转换为图像坐标系:相似三角形原理。

1a2820b568296090da2c92a34d9c9024.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

其中:f表示相机焦距

6d9b52578baf5e2406d8b2f471c2952a.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

图像坐标系转换为像素坐标系:图像坐标系单位mm,坐标系原点在光轴和成像平面交点,但像素坐标系是度量单位pixel,原点在左上角顶点。

bb7318707c658759f230b51458b57a3f.png
图片出处:https://blog.youkuaiyun.com/weixin_38842821/article/details/125933604

式中:和 分别表示一个pixel分别在 x 和 y 轴方向代表多少mm。

综上所述,像素坐标系和世界坐标系转换总公式:

1910145cbfd168179641c8e3c78e2247.png
图片出处:https://blog.youkuaiyun.com/qq_32335687/article/details/100130861
d40169487cbae33e97d30c7f554fce7b.png

相机内参影响从相机坐标系到像素坐标系的转换,相机外参影响世界坐标系到相机坐标系的转换。从上述公式可知,在不选定基准平面的前提下,单目相机无法将像素坐标系二维点转换到世界坐标系三维点,因为 值不知道,  值是从三维点逆推获得的,单如果假定点在基准平面上,可以从二维点获得三维点。

1:单目测距

本质上单目测距利用的是相似三角形,查阅资料得到以下两种常见的方法,以下两种方法都有设定基准平面,在相机标定时,棋盘格是放置在水平面,如下图所示:

6e04e989d74b395f21f8725f399453c3.png
图片来源:《Vision-based Vehicle Speed Estimation: ASurvey》

方法1

714453018eca032b4f231159a01ae542.png
图片来源:《Robust Range Estimation with a Monocular Camera forVision-Based Forward Collision Warning System》
17edd726861bbc3709c3e3994b4dab29.png ec98de491d38a58cf5d85f9258ad31ee.png

方法2

e50fd301b9e66c899dad6db8d9852dde.png
图片来源:https://avoid.overfit.cn/post/2b0cf726ab524a23bea492f08ae9b3d6
e9e1712d9fba87382e5a080e61221afe.png e446c623cf783dea59db76a6cd2ddbc9.png

3:思考

在工作中遇到一个问题,在一张图像中,假设检测器只能检测到人的脑袋,如何根据脑袋位置大致估算出脚在图像中的位置,除了简单的按照人头和人身体的先验比例,探讨用相机模型的方法是否可以实现。开始的想法是先将人头检测框上边线中点坐标还原到世界坐标系,选地面作为基准坐标系,粗略的认为在世界坐标系中,头和脚的和 是一致的,脚在地面,=0这样就可以通过公式将脚还原到图像坐标系,但通过前面2节的分析发现,就算指定地面为基准平面,相机的内参和外参,相机架设高度,架设角度全部知道,也无法通过人头位置还原出人脚位置,因为像素坐标系人头顶的位置无法还原到世界坐标系,除非给人设定一个先验身高。

如果给定一个先验身高,人头顶点的 就可以计算出来,三个未知数,三个方程,就可以解出三维点坐标。

或者按照单目测距相似三角形方法,如上图所示,abc平面为图像坐标系平面,问题转化为求ac,b为光点在成像平面投影,相机内参已知是可以确定的,a点可以确定,因此:

8a53b4ea4ae45aa43969cae9058eca65.png
简易建模
16a9678283300beb0b22d437eaf3299e.png

如果不使用相机模型:根据人头顶点像素点坐标(x,y)和人体高度的先验数据,拟合出 y 和人体高度的关系曲线,大家有好的方法欢迎留言讨论!!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、点云3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码学习)

44d57edb438b72880fc32a82d302c142.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

475aa83019ad6321632eb82ad11b0717.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

16b0ab7d42b5639930410f82394e5d92.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

49f6cd36596ef070f0cc2ee4fae5a485.jpeg

### 使用单目摄像头、OpenCV 和 YOLOv5 进行物体测距实现使用单目摄像头结合 OpenCV 和 YOLOv5 的物体测距功能,可以按照以下方法设计系统架构并完成开发。 #### 1. 原理概述 单目测距的核心在于通过已知参数计算目标物的实际尺寸与其在图像中的像素大小之间的比例关系。YOLOv5 负责检测目标的位置和类别,而 OpenCV 则用于处理图像以及辅助计算离[^1]。 #### 2. 数据准备与校准 为了精确估算离,需要先对相机进行标定以获得焦 \(f\) 和传感器宽度 \(w_s\)[^1]。可以通过 OpenCV 提供的 `cv2.calibrateCamera` 函数完成这一过程: ```python import cv2 import numpy as np # 加载棋盘格图片路径列表 image_paths = [...] # 替换为实际文件名数组 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) objp = np.zeros((6*9, 3), np.float32) objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) * 2.5 # 棋盘方块边长位毫米 objpoints = [] imgpoints = [] for fname in image_paths: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, (9, 6), None) if ret is True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) imgpoints.append(corners2) ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) print(mtx) # 输出内参矩阵 ``` 上述代码会返回相机的内参矩阵 `mtx`,其中包含了焦信息。 #### 3. 测量模型构建 假设目标的真实高度为 \(H_{real}\),其对应的像素高度为 \(h_p\),则可以根据三角几何推导出如下公式来表示离 \(D\): \[ D = \frac{f \cdot H_{real}}{h_p} \] 这里需要注意的是,\(H_{real}\) 是预先设定的目标真实物理尺寸,在不同应用场景下可能有所不同[^2]。 #### 4. 结合 YOLOv5 获取目标位置 加载预训练好的 YOLOv5 权重文件,并运行推理得到边界框坐标 `(xmin, ymin, xmax, ymax)` 及置信度分数等信息。以下是 Python 示例代码片段: ```python from ultralytics import YOLO model = YOLO('yolov5s.pt') # 或者替换为你自己的权重文件 results = model.predict(source='path/to/image.jpg', conf=0.5) for result in results: boxes = result.boxes.cpu().numpy() for box in boxes: cls_id = int(box.cls[0]) confidence = float(box.conf[0]) xmin, ymin, xmax, ymax = map(int, box.xyxy[0]) # 边界框左上角右下角坐标 height_pixels = abs(ymax - ymin) # 物体的高度(像素数) distance = calculate_distance(focal_length=focal_len, real_height=known_real_height, pixel_height=height_pixels) print(f"Detected object at {distance:.2f} meters away.") ``` 函数 `calculate_distance()` 定义如下: ```python def calculate_distance(focal_length, real_height, pixel_height): return focal_length * real_height / pixel_height ``` #### 5. 效果优化建议 - **多帧平均法**:对于动态视频流输入,可采用连续几帧的结果取均值减少误差影响。 - **环境光照补偿**:考虑光线变化带来的干扰因素,适当调整曝光时间和增益设置。 - **深度学习改进版**:如果条件允许的话,还可以尝试引入更先进的端到端解决方案比如 Monodepth2 等开源工具包进一步提升精度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值