C++代码
特征提取:找出2张图片中相似的点
- 特征:关键点(例如角点,明暗变化大的点)+描述子(记录的关键点的特征信息,方向,旋转 等)
- FAST特征点:角点,检测局部像素灰度变化大的地方,FAST-N 半径为3的圆上有16个像素点,计算是否连续N个点亮度大于或小于阈值
- ORB = ORrented Fast 特征点(像素几何中心到平均亮度中心的连线是方向)+ BRIEF 描述子(二进制,用汉明距离描述差异)
- 匹配方法:暴力匹配BFM,快速近似最近邻FLANN
- opencv2/features2d/features2d.hpp KeyPoint Dmatch
2D-2D 对极几何
-
对极约束:
p 2 T K − T t ∧ R K − 1 p 1 = 0 p_2^TK^{-T}t^{\wedge}RK^{-1}p_1=0 p2TK−Tt∧RK−1p1=0 -
基础fundamental矩阵
F = K − T t ∧ R K − 1 F=K^{-T}t^{\wedge}RK^{-1} F=K−Tt∧RK−1 -
本质essential矩阵,5个自由度,尺度等价性.
E = t ∧ R E=t^{\wedge}R E=t∧R -
八点法 :
- 用于单目slam初始化
- SVD分解计算后后4组值,要取深度为正的
- 纯旋转问题,t为0时E无法分解出R,t ,这时用单应矩阵H求解
- 多于8对点,超定,用最小二乘解
- 特征点共面,八点法会退化无法求解,例如无人机的下视
-
单应矩阵Homography
适用于特征点共面,例如无人机的下视摄像头。
p 2 = K ( R − t n T / d ) K − 1 p 1 p_2=K(R-tn^T/d)K^{-1}p_1 p2=K(R−tnT/d)K−1p1
p 2 = H P 1 p_2=HP_1 p2=HP1
H = K ( R − t n T / d ) K − 1 H=K(R-tn^T/d)K^{-1} H=K(R−tnT/d)K−1
- 三角测量
definition: 一对特征点像素位置射线的空间位置交点 -> 空间位置- opencv : triangulation()
- 当t较小,像素深度的不确定性大
- 当t较大,特征点又少了,这就是三角化的矛盾
总结
- 提取特征点
- 记录特征点信息
- 匹配特征点
- 对极约束计算(R,t)
- 三角测量计算深度