单目视觉(1)

note:学习一下单目视觉,本文只代表作者写本文时的想法和理解。限于当时的水平和学习的进展,可能有些错误,望谅解。


问题提出

人眼观察世界通过两个视角来形成对空间的基本认知。模仿人眼的原理,可以使用多个摄像机同时采集同一空间中的图像,然后通过一定的算法来实现对三维空间的重建。这就是典型的双目视觉(stereo-vision)问题。由此可以衍生出多视觉(multi-vision)的重建问题。那么如果只有一台摄像机,是否可以呢?通过单个摄像头拍摄的图像来实现三维空间的重建称之为单目视觉。


基本原理

单帧测距

(一)测物体到相机的距离
单目视觉获得的图像本质上是2D的,结合相机的成像模型(初中物理,小孔成像)j就可以获知距离了,前提是你知道物体的真实大小。

小孔成像

  • case 1: 物体在摄像机的正前方,即相机坐标系的y轴上。
    如果物体在摄像机的正前方(光轴上),那么可以做一个简单的公式计算:
    fd=hH(1) f d = h H ( 1 )
    <script type="math/tex; mode=display" id="MathJax-Element-3"> \frac{f}{d}=\frac{h}{H} \quad (1) </script>
    其中f为焦距,d为物体到相机的距离,h为物体在像上的高度,H为物体的实际高度。

焦距是相机的内参数,一旦相机确定,这个数值基本就是确定了。H为物体的实际高度,这个也是可以获取的。 d d <script type="math/tex" id="MathJax-Element-4">d</script>为所求,那么 h <script type="math/tex" id="MathJax-Element-5">h</script>的获知就是成了关键。 h h <script type="math/tex" id="MathJax-Element-6">h</script>代表了物体所成像的高度。像的获取是通过摄像机内部的感知元件作用后保留下来的,如果知道每个感知元件的物理尺寸( δ <script type="math/tex" id="MathJax-Element-7">\delta</script>)和像中包含的感知元件的个数( n n <script type="math/tex" id="MathJax-Element-8">n</script>),那么就能够得知像的高度 h = n δ <script type="math/tex" id="MathJax-Element-9">h=n * \delta</script>。那么式子(1)就可以转化为:

fd=nδH(2)d=fHnδ(3)(1)(2) (1) f d = n ⋅ δ H ( 2 ) (2) d = f ⋅ H n ⋅ δ ( 3 )
<script type="math/tex; mode=display" id="MathJax-Element-10"> \begin{align} &\frac{f}{d}=\frac{n \cdot \delta}{H} \quad (2) \\ &d=\frac{f \cdot H}{n \cdot \delta} \quad (3) \end{align} </script>

case 2: 物体在摄像机坐标系的xy平面上有偏移(即在x轴上有值)
那么物体成像并不是在图像的中间部分,而会在中间偏左或者偏右的位置。因为物体并不是在摄像机的正前方,反而存在一个水平方向的夹角 α α <script type="math/tex" id="MathJax-Element-11">\alpha</script>。此时光心到像中心(非图像中心)的距离与光心到物体的距离满足case 1的模型。即有:

dflα=fHnδ(3)=f2+l2(4)=nxδ  (5)=arctan(lf)(6)(3)(4)(5)(6) (3) d ′ = f ′ ⋅ H n ⋅ δ ( 3 ) (4) f ′ = f 2 + l 2 ( 4 ) (5) l = n x ⋅ δ     ( 5 ) (6) α = arctan ⁡ ( l f ) ( 6 )
<script type="math/tex; mode=display" id="MathJax-Element-12"> \begin{align} d'&=\frac{f' \cdot H}{n \cdot \delta} \quad (3) \\ f'&=\sqrt{f^2 + l^2} \quad (4)\\ l&= n_x \cdot \delta \ \ \qquad (5)\\ \alpha &= \arctan (\frac{l}{f}) \quad(6)\\ \end{align} </script>
其中 f f ′ <script type="math/tex" id="MathJax-Element-13">f'</script>表示光心到像中心的距离, d d ′ <script type="math/tex" id="MathJax-Element-14">d'</script>表示光心到物体中心的距离, l l <script type="math/tex" id="MathJax-Element-15">l</script>表示像中心到图像中心的水平偏移距离, n x <script type="math/tex" id="MathJax-Element-16">n_x</script>表示水平偏移的像素个数。
此时,可以得到物体到摄像机的距离为:
d=dcosα=Hf2+(nxδ)2nδff2+(nxδ)2=Hfnδ(7) d = d ′ ⋅ cos ⁡ α = H ⋅ f 2 + ( n x ⋅ δ ) 2 n ⋅ δ ⋅ f f 2 + ( n x ⋅ δ ) 2 = H ⋅ f n ⋅ δ ( 7 )
<script type="math/tex; mode=display" id="MathJax-Element-17"> d=d' \cdot \cos \alpha = \frac{H \cdot \sqrt {f^2 +(n_x \cdot \delta)^2}}{n \cdot \delta} \cdot \frac{f}{ \sqrt {f^2 +(n_x \cdot \delta)^2}} = \frac{H \cdot f}{n \cdot \delta} \quad (7) </script>
这个符合预期,因为只是在x轴上移动了而已,并没有增加y轴上的距离。所以公式应该与 case1相同。

case 3: 当物体在z轴上有移动时,即在光轴上下移动。
可以猜想,计算公式也和前两个case相同。

(二)测物体的大小
依据之前推导的公式,如果知道了物体到摄像机的距离,那么其实可以推导出物体的一些尺寸。即:

H=nδdf(8) H = n ⋅ δ ⋅ d f ( 8 )
<script type="math/tex; mode=display" id="MathJax-Element-18">H=\frac{n\cdot \delta\cdot d}{f} \quad (8)</script>

多帧测距

多帧测距是通过摄像机拍摄运动的物体获得多幅图像,然后寻找其中相对应的部分计算出像素的相对位移,然后通过相应的算法来测算距离。(感觉有点类似双目视觉,但理论推导可能不一样)

序列图像
由透镜成像原理可知:

1z1+1d1=1f(9)1z2+1d2=1f(10)h1z1=Hd1(11)h2z2=Hd2(12)(7)(8)(9)(10) (7) 1 z 1 + 1 d 1 = 1 f ( 9 ) (8) 1 z 2 + 1 d 2 = 1 f ( 10 ) (9) h 1 z 1 = H d 1 ( 11 ) (10) h 2 z 2 = H d 2 ( 12 )
<script type="math/tex; mode=display" id="MathJax-Element-19">\begin{align} &\frac{1}{z_1}+\frac{1}{d_1}=\frac{1}{f} \quad (9)\\ &\frac{1}{z_2}+\frac{1}{d_2}=\frac{1}{f} \quad (10)\\ &\frac{h_1}{z_1}=\frac{H}{d_1} \quad (11)\\ &\frac{h_2}{z_2}=\frac{H}{d_2} \quad (12)\\ \end{align} </script>
那么则有:
d1h1=d2h2(13)() d 1 ⋅ h 1 = d 2 ⋅ h 2 ( 13 ) ( 像 大 小 与 距 离 成 反 比 )
<script type="math/tex; mode=display" id="MathJax-Element-20">d_1\cdot h_1=d_2\cdot h_2 \quad (13) \quad (像大小与距离成反比)</script>

NOTE: N O T E : 以 上 都 是 在 理 想 状 况 下 进 行 的 分 析 。 在 实 际 情 况 中 需 要 做 更 多 的 处 理 , 比 如 相 机 标 定 , 图 像 的 校 正 , 变 换 等 。 <script type="math/tex" id="MathJax-Element-21">\color{red}{NOTE:以上都是在理想状况下进行的分析。在实际情况中需要做更多的处理, 比如相机标定,图像的校正,变换等。}</script>

References

[1] 单目视觉测距
[2] OpenCV单目平面测距
[3] 基于单目视觉的实时测距方法研究


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐