前言
这部分函数通过对输入的本质矩阵E进行SVD分解得到的左奇异值矩阵的最后一列作为平移向量t,在通过构造一个绕Z旋转pi/2的旋转矩阵来构建旋转矩阵R。
这部分实际上已经固定了求解模式我这里仅仅是做了一些简单的了解。
1.函数声明
void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t)
2.函数定义
1.对本质矩阵进行SVD分解
// 对本质矩阵进行奇异值分解
//准备存储对本质矩阵进行奇异值分解的结果
cv::Mat u,w,vt;
//对本质矩阵进行奇异值分解
cv::SVD::compute(E,w,u,vt);
2.将左奇异值矩阵最后一列作为平移向量并归一化
// 左奇异值矩阵U的最后一列就是t,对其进行归一化
u.col(2).copyTo(t);
t=t/cv::norm(t);
3.构造一个绕Z旋转pi/2的旋转矩阵来构建旋转矩阵R。
// 构造一个绕Z轴旋转pi/2的旋转矩阵W,按照下式组合得到旋转矩阵 R1 = u*W*vt
//计算完成后要检查一下旋转矩阵行列式的数值,使其满足行列式为1的约束
cv::Mat W(3,3,CV_32F,cv::Scalar(0));
W.at<float>(0,1)=-1;
W.at<float>(1,0)=1;
W.at<float>(2,2)=1;
4.利用行列式为1的约束来构造不同的的旋转矩阵R
//计算
R1 = u*W*vt;
//旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
if(cv::determinant(R1)<0)
R1=-R1;
// 同理将矩阵W取转置来按照相同的公式计算旋转矩阵R2 = u*W.t()*vt
R2 = u*W.t()*vt;
//旋转矩阵有行列式为1的约束
if(cv::determinant(R2)<0)
R2=-R2;
结束语
以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。