单目摄像头测距

1. 前言

随着自动驾驶的发展,现代汽车的智能化程度逐步提高,基于视觉系统的自动驾驶也逐步趋于稳定——特斯拉、Mobileye、CommaAI等机构起着推波助澜的作用。

自动驾驶场景或者Adas场景中,当检测出前方车辆后通常需要进行距离估计,为车辆控制提供距离参考信息;而基于视觉的移动机器人也存在该需求。单目摄像头光学图像测距具有低成本和计算快的优点,主要有两种常用的测距方式1

  • 使用目标物体大小和摄像头焦距
  • 使用摄像头高度和俯仰角

本文将介绍第二种测距方式。

2. 几何关系示意图

该部分直接引用自参考文献2

投影关系图和投影平面2如下所示,
单目摄像头测距
平面ABUABUABU代表路平面,ABCDABCDABCD为摄像头拍摄到的路平面上的梯形区域OOO为摄像机OOO点为摄像机镜头中心点,OGOGOG为摄像机光轴,GGG 点为摄像机光轴和路平面的交点(同时也是视野梯形的对角线交点),III点为OOO点在路平面上的垂直投影。在路面坐标系中, 将GGG点定义为坐标系原点,,车辆前进方向定义为YYY轴方向。
单目摄像头测距
GABCDG、A、B 、C、DG、A、B、C、D 各点在图像平面内的对应点上图所示,abcda、b、c、da、b、c、d为像平面矩形的4个端点,HHH和WWW分别为像平面的高和宽。定义图像矩形的中点ggg为像平面坐标系的坐标原点,y 轴代表车辆前进方向。

取路面上一点PPP,其在路平面坐标系的坐标为(XP,YP)(X_P, Y_P)(XP​,YP​),PPP点在图像平面内的对应点为ppp, 其在像平面坐标系的坐标为(xp,yp)(x_p, y_p)(xp​,yp​)。

3. 距离计算

3.1 参数

  • 摄像头高度hhh
  • 摄像头水平视场角2β02\beta_02β0​
  • 摄像头垂直视场角2α02\alpha_02α0​
  • 摄像头俯仰角γ0\gamma_0γ0​

相关概念请参见博客:相机焦距与视场角

3.2 Y轴方向的成像模型2

单目摄像头测距
摄像头光轴(OGOGOG)所在的与路面相垂直的平面为OEIOEIOEI。图中各字符与几何关系示意图中对应字符含义相同。直线MLMLML与直线OGOGOG垂直,与直线fFfFfF的延长线相交于点LLL。点pyp_ypy​表示像平面上的点ppp在直线efefef上的投影(yyy轴方向),PyP_yPy​点是路面上的点PPP在视野纵向对称线上的投影,Z是直线pyPyp_yP_ypy​Py​与直线线ML线ML线ML的交点。

根据三角函数关系和相似三角形可得,
tanα=ZGGOtanα0=MGGOZGMG=pygeg \begin{aligned} \tan\alpha &= \frac{ZG}{GO} \\ \tan\alpha_0 &= \frac{MG}{GO} \\ \frac{ZG}{MG} &= \frac{p_yg}{eg} \end{aligned} tanαtanα0​MGZG​​=GOZG​=GOMG​=egpy​g​​
所以,
tanα=pygegtanα0=pygH/2tanα0=yH/2tanα0 \begin{aligned} \tan\alpha &= \frac{p_yg}{eg}*\tan\alpha_0\\ &=\frac{p_yg}{H/2}*\tan\alpha_0\\ &=\frac{y}{H/2}*\tan\alpha_0 \end{aligned} tanα​=egpy​g​∗tanα0​=H/2py​g​∗tanα0​=H/2y​∗tanα0​​
那么,
PyI=OItan(90αγ0)=htan(90αγ0) \begin{aligned} P_yI &= \frac{OI}{\tan(90^{\circ}-\alpha-\gamma_0)}\\ &= \frac{h}{\tan(90^{\circ}-\alpha-\gamma_0)} \end{aligned} Py​I​=tan(90∘−α−γ0​)OI​=tan(90∘−α−γ0​)h​​

注:计算角度α=arctan(yH/2tanα0)\alpha = \arctan(\frac{y}{H/2}*\tan\alpha_0)α=arctan(H/2y​∗tanα0​)时,y为空间点在投影面上的y轴坐标,是有符号的,H为图像高度。

3.3 X轴方向的成像模型

单目摄像头测距
PxPxPx为点P在X轴上的投影点,
在三角形ΔOPyL\Delta OP_yLΔOPy​L中,
tanα1=PyPOPy=XpOPy=Xph2+PyI2 \begin{aligned} \tan \alpha_1 &=\frac{P_yP}{OP_y} \\ &= \frac{|X_p|}{OP_y}\\ &= \frac{|X_p|}{\sqrt{h^2+P_yI^2}} \end{aligned} tanα1​​=OPy​Py​P​=OPy​∣Xp​∣​=h2+Py​I2​∣Xp​∣​​
根据P点成像的相似三角形可得,
OPytanα1OPytanβ0=xW/2 \begin{aligned} \frac{OP_y\tan\alpha_1}{OP_y\tan\beta_0} &=\frac{x}{W/2} \\ \end{aligned} OPy​tanβ0​OPy​tanα1​​​=W/2x​​
综上,
Xp=h2+PyI2xtanβ0W/2|X_p| = \frac{\sqrt{h^2+P_yI^2} *x *\tan\beta_0}{W/2}∣Xp​∣=W/2h2+Py​I2​∗x∗tanβ0​​

x为空间点在投影面上的x轴坐标

4. Show me the code

代码很简单,后续补充上来。

Reference


  1. Alizadeh, Peyman. Object distance measurement using a single camera for robotic applications. Diss. Laurentian University of Sudbury, 2015. ↩︎

  2. 郭磊, 徐友春, *, & 连小珉. (2006). 基于单目视觉的实时测距方法研究 (Doctoral dissertation). ↩︎ ↩︎

上一篇:拔得头筹 | 阿里云混合云荣膺IPv6最佳实践奖


下一篇:看懂IPv6+,这篇就够了