1.双目立体视觉算法
流程图
1.
1. 1.1矫正
矫正两个相机之间的R t和畸变,使两个相机的成像平面满足:
- 两幅图严格的 行对应
- 两幅图像的 对极线 恰好在 同一水平线 上
1.2 极线约束 与 极线匹配
极线约束:空间中任意一点在图像平面上的投影点,必然处于该点和两个摄像头光心组成的 对极平面 上(极线约束使得特征点的匹配由二维图像平面上降低到以为搜索中,大大加快)
由于两垂直向量点积为0,所以
上式即为极线约束
极线搜索 由于矫正时两个图像平面已经行对齐,故左图中的一点在右图中的对应一定在同一行中,这样大大加快了匹配效率,常用的匹配算法有:Block Matching;Graph Cut
1.3 获得深度信息
通过匹配算法,得到空间一点在两个图像平面的位置,然后利用如下的几何计算即可求得深度信息
2.单目视觉算法
算法流程
建立图像块 → 根据相机光心确定搜索极线 → 极线搜索算法 → 深度滤波器进行滤波 → 得到对应像素后,进行 三角测量 → 得到深度信息
如何匹配?极线搜索和块匹配
匹配结果优化?深度滤波器技术
三角测量原理
根据对极几何,两个成像平面中,同一空间点的归一化坐标x1,x2,满足:
s1x1=s2Rx2+t
两侧同时左乘x1∧ 左侧为零,右侧可求解出深度信息s2
块匹配&极线搜索
块匹配 是由于单个像素在极线上搜索时只有亮度信息,没有区分性,所以以此像素点为中心,建立一个w*w的像素块
快匹配的算法有:
SAD(sum of absolute difference)
SSD ( sum of squared distance )
NCC (Normalized cross correlationw)
极线搜索 根据极线约束,成像面上一点在另一成像面上的对应点,必定在所在的极线上,然后在该极线上,根据图像块进行搜索,即可得到对应的匹配点。
深度滤波器
确定基准图后,利用其后的多张图对基准图进行分布估计
- 对参考图中一点计算的深度值d服从:P(d) = N(μ,σ
# 2** )** - 同样,当新得到的观察图中,对参考图的深度进行再次的估计,这次算出的深度dfuse 服从 P(d
# fuse** ) = N(μ**
# fuse** , σ**
# fuse
# 2** )** 把两个高斯分布相乘,得到融合后的高斯分布:
这里的μ,就是每次计算出来的深度值,而σ就是假设有一个像素的误差时深度的d的误差 δp
- 方差 δp 的计算
我们假设匹配到的点与正确的匹配点有一个像素的差异,那么通过三角化计算出来的深度就会与真实的相差一个δp,他的大小就是如图所示,根据三角函数计算
a=p-t
α=arccos<p,t>
β=arccos<a,-t>
设焦距为f
δp = ||p|| - ||p'||
这个δp是深度的一个均方差,深度滤波器就是要不断的缩小这个值
3. SVD分解 Singular Value Decomposition
学习自:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
3.1特征值分解
向量v是方阵A的特征值λ的特征向量
一个矩阵的一组特征向量是一组正交的向量特征值分解就是把一个矩阵写成
其中Q的每一列是这个矩阵的特征向量,Σ是以特征值为对角元素的对角矩阵,
回到 对于向量v,矩阵A的左乘对它进行了一次线性变换,而对应的λ就是这一变换的主方向
特征值分解中的Σ中的特征值就是这些变换方向的权重,从大到小排列,就得到了多维矩阵线性变换中最主要的前n个,特征值对应的特征向量表示了这一方向的向量坐标。
特征* 值分解提取了这个矩阵的最主要的特征 ,但是它只能分解 方阵*
3.2 奇异值分解
奇异值分解中A
n*m
,Σ
n*m
,