路标点三角化
这里原理部分主要是参考多视图几何低十一章,结构计算,代码部分主要参考ORBSLAM中的实现
问题阐述
在已知两视图之间的变换关系-基本矩阵F,求解三维点X
假设测量点是和,,如果没有误差,那么存在一个三维点满足.其中P表示摄像机矩阵
定义是对应点以及一对相机矩阵和来计算空间点的一种三角形法,有 该三角形称为在变换H下是不变的,如果 这也就是说,用了变换之后的相机矩阵也可以得到相同的三维空间点,也就是使用这种方法是XX变换不变的.
### 为什么用二维误差而不是三维
对于射影重构而言,在三维射影空间对误差进行最小化是不合适的.因为像距离和垂直等概念在射影几何下无效.如果使用这种三维空间下的误差来计算的话,这种方法并不是射影不变的
真正的射影不变的方法需要在二维上进行,估计一个三维点,其满足摄像机几何,所以他的投影便是 这么做的目的就是,使用测量的和,来估计
在噪声的影响下,最大似然估计由最小化重投影误差--的投影到图像测量点的距离得到
线性三角形法
线性三角形法就是一种DLT的方式,在每一幅图上都有测量,且这些方程可以组合成的方式,其是关于的线性方程.
因为有,所以可以得到叉乘的形式,也就是,展开可以得到 其中是相机矩阵的行,所以方程使用两个点可以获得以下的A矩阵 也就是说,每一组像点可以获得4个方程,这是一个冗余的方程组,因此可以使用齐次的方式(DLT)来进行求解
### 齐次方程组的最小二乘解
考虑到方程,同时该方程方程数目大于未知量个数,因此是一个超定方程组,如果x是方程组一个解,那么kx这些也是属于方程的解,也就是存在解空间.具体解法如下
目标
给定一个行数不少于列数的矩阵A,求最小化并满足的x
解法
是的最后一列,其中是的SVD分解
ORBSLAM中的实现
ORBSLAM中关于三角化点的构造在Initializer中,
其实现和之前原理中的是一模一样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
void Initializer::Triangulate( const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D) {
cv::Mat A(4,4,CV_32F);
A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0); A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1); A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0); A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1);
cv::Mat u,w,vt; cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV); x3D = vt.row(3).t(); x3D = x3D.rowRange(0,3)/x3D.at<float>(3); }
|