上一篇文章中,咱们介绍了单目SLAM中的三角化恢复三维点深度的原理,本篇文章咱们来聊一聊三角化深度值的偏差分析。算法
目录:优化
(1)三角化所带来的偏差的提出spa
(2)三角化中偏差的来源分析3d
(3)如何减少三角化所带来的偏差code
(4)三角化所遇到的奇异状况blog
(1)三角化所带来的偏差的提出get
上一篇文章中,咱们提到了两帧图像中的特征点坐标三角化获得空间点的三维信息。图像处理
今天,咱们来分析一下三角化获得的三维信息中深度的偏差。class
如上图所示:基础
P为空间中的一个三维点,p1和p2分别为在两个位置处,摄像机观察到的投影的二维点坐标。
l2为p1在第二幅图中所对应的极线(极线的概念请参考立体视觉中的对极几何,这里再也不赘述)。
如今,咱们要探讨的是:
若是咱们在l2进行极线搜索时,所找到的p2'点与真实的p2点有一个像素的偏差,那么会给三角化后的三维点P的深度z带来多大的偏差。
首先,根据上图,咱们能够获得向量之间的关系,以及三角化中的两个夹角的定义:
a = p - t 公式(1)
α = arccos<p, t> 公式(2)
β = arccos<a, -t> 公式(3)
其中,a, p, t均为向量,α和β为图中所示的两个夹角。
若是此时,咱们求取的p2'点与p2点有一个像素的误差,同时,这一个像素的误差又会给β带来δβ的角度变化,咱们利用β'来表示对β进行δβ扰动后的新的角度。
设相机的焦距为f,则:
公式(4):
公式(5):
公式(6):
至此,加入扰动后的全部新的角度咱们都求出来了。
由正弦定理,咱们能够获得:
公式(7):
则由第二个位置上的二维点的一个像素的偏差,可能致使的三角化后深度的偏差为:
δp = ||p|| - ||p'||
这里的δp其实也正是深度的一个均方差(不肯定度σobs),这个不肯定度是咱们后面要介绍的深度滤波器的一个很重要的概念,深度滤波器的目的也正是要不断减少这个不肯定度,使得深度的不肯定度最后可以收敛到一个可以接受的值。
(2)三角化中偏差的来源分析
上面分析了第二幅图中的特征点p2的偏差是如何影响三角化后的深度值的。
下面,咱们来指出三角化的偏差来源有哪几方面:
a.图像的分辨率:图像的分辨率越高,一个像素所带来的δβ就越小。
b.特征点求取时的精度:是否作到亚像素,在亚像素的基础上,偏差有多大?
c.p1点的偏差:会引发极线l2的偏差,从而间接地影响p2点的精度。
d.相机两次位置的平移向量t的大小:t的模的大小也表明了对极几何中的基线长度,由公式(7)能够看出基线长度越大,三角化的偏差越小。
(3)如何减少三角化所带来的偏差
根据【(2)三角化中偏差的来源分析】中所分析的一些因素可知,要想减少三角化过程当中引入的偏差,能够有以下几个方法:
a.选取尽量高分辨率的相机。
b.进行亚像素的优化(好比在极线搜索时对像素点坐标进行双线性插值)
// 双线性灰度插值 inline double getBilinearInterpolatedValue( const Mat& img, const Vector2d& pt ) { uchar* d = & img.data[ int(pt(1,0))*img.step+int(pt(0,0)) ]; double xx = pt(0,0) - floor(pt(0,0)); double yy = pt(1,0) - floor(pt(1,0)); return (( 1-xx ) * ( 1-yy ) * double(d[0]) + xx* ( 1-yy ) * double(d[1]) + ( 1-xx ) *yy* double(d[img.step]) + xx*yy*double(d[img.step+1]))/255.0; }
(关于双线性插值,这篇文章作了比较清晰的讲解:http://blog.163.com/guohuanhuan_cool@126/blog/static/167614238201161525538402/)
c.一样使用亚像素级的图像处理算法来处理p1点。
d.在不丢失特征点的状况下,让平移量t尽可能大。
(4)三角化所遇到的奇异状况
由上面的公式推导咱们能够看出,三角化中,必需要有平移量t,不然没法构成三角形,进行三角化。
因此在有些单目的SLAM,AR/VR的场景中,有经验的人都会有意识地将设备或者相机进行必定量的平移,而不会在原地进行纯旋转。
总结一下,咱们今天分析了三角化过程当中的偏差有哪些,并从理论上对偏差进行了量化的推导。同时,咱们还分析了若是减少三角化过程当中的偏差。
下一篇文章,咱们将会带着你们一块儿分析深度滤波器的原理。敬请期待!