vue php 哪个做网站 好,德州宁津网站建设,关键词挖掘爱站网,阿里云认证网站建设前言
在平面场景我们通过求解单应矩阵H来求解位姿#xff0c;但是我们在实际中常见的都是非平面场景#xff0c; 此时需要用基础矩阵F求解位姿。
1.函数声明
cv::Mat Initializer::ComputeF21(const vectorcv::Point2f vP1, const vectorcv::Point2f但是我们在实际中常见的都是非平面场景 此时需要用基础矩阵F求解位姿。
1.函数声明
cv::Mat Initializer::ComputeF21(const vectorcv::Point2f vP1, const vectorcv::Point2f vP2) 2.函数定义
用基础矩阵描述特征点之间的变换关系。 矩阵形式 方程形式 矩阵方程形式 对矩阵进行两次SVD分解右奇异矩阵的最后一列就是最优解。
使用两次 SVD 的原因
1.第一次 SVD 用于从特征点对中解线性方程得到初步估计的基础矩阵Fpre。
2.第二次 SVD 用于对初步估计进行优化施加基础矩阵的秩约束确保结果符合理论要求。
/*根据特征点匹配求fundamental matrixnormalized 8点法注意F矩阵有秩为2的约束所以需要两次SVD分解vP1 参考帧中归一化后的特征点vP2 当前帧中归一化后的特征点return cv::Mat 最后计算得到的基础矩阵F*/
cv::Mat Initializer::ComputeF21(const vectorcv::Point2f vP1, //归一化后的点, in reference frameconst vectorcv::Point2f vP2) //归一化后的点, in current frame
{//获取参与计算的特征点对数const int N vP1.size();//初始化A矩阵cv::Mat A(N,9,CV_32F); // N*9维// 构造矩阵A将每个特征点添加到矩阵A中的元素for(int i0; iN; i){const float u1 vP1[i].x;const float v1 vP1[i].y;const float u2 vP2[i].x;const float v2 vP2[i].y;A.atfloat(i,0) u2*u1;A.atfloat(i,1) u2*v1;A.atfloat(i,2) u2;A.atfloat(i,3) v2*u1;A.atfloat(i,4) v2*v1;A.atfloat(i,5) v2;A.atfloat(i,6) u1;A.atfloat(i,7) v1;A.atfloat(i,8) 1;}//存储奇异值分解结果的变量cv::Mat u,w,vt;// 定义输出变量u是左边的正交矩阵U w为奇异矩阵vt中的t表示是右正交矩阵V的转置cv::SVDecomp(A,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);// 转换成基础矩阵的形式cv::Mat Fpre vt.row(8).reshape(0, 3); // v的最后一列//基础矩阵的秩为2,而我们不敢保证计算得到的这个结果的秩为2,所以需要通过第二次奇异值分解,来强制使其秩为2// 对初步得来的基础矩阵进行第2次奇异值分解cv::SVDecomp(Fpre,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);// 秩2约束强制将第3个奇异值设置为0w.atfloat(2)0; // 重新组合好满足秩约束的基础矩阵作为最终计算结果返回 return u*cv::Mat::diag(w)*vt;
}
结束语
以上就是我学习到的内容如果对您有帮助请多多支持我如果哪里有问题欢迎大家在评论区积极讨论我看到会及时回复。