看了老师的视频你就会了
新手eigen实现
坑:在preM到roM的处理需要注意,eigen默认先按列排(? ),需要修改。
#include <iostream>
#include <vector>
#include <string>
#include <Eigen/Eigen>
#include <math.h>
using namespace std;
//g++ test.cpp -o test -I /usr/include/eigen3 -DNDEBUG && ./test
void SingleCamera(Eigen::MatrixXf& w_coor,Eigen::MatrixXf& c_coor,int number,
Eigen::MatrixXf& w_check,Eigen::MatrixXf& c_check)
{
Eigen::MatrixXf K(3,3);//内参矩阵
Eigen::MatrixXf R(3,3);//旋转矩阵
Eigen::MatrixXf t(3,1);//平移矩阵
//1. 构造P PM=0
Eigen::MatrixXf P(number,12);
for(int i=0;i<number;++i){
int c=i/2;
Eigen::MatrixXf p1=w_coor.row(c);
Eigen::MatrixXf p2(1,4);
p2<<0,0,0,0;
if(i%2==0){
Eigen::MatrixXf p3=-c_coor(c,0)*p1;
P.row(i)<<p1,p2,p3;
}
else{
Eigen::MatrixXf p3=-c_coor(c,1)*p1;
P.row(i)<<p2,p1,p3;
}
}
cout<<"P is form of:"<<endl;
cout<<P<<endl;
//2. 对P SVD-UDV^T得到M
Eigen::JacobiSVD<Eigen::MatrixXf> svd(P,Eigen::ComputeFullU | Eigen::ComputeFullV);
Eigen::MatrixXf U=svd.matrixU(),V=svd.mat