接前面
控制台显示
用 meshlab 来把重建的点文件和pmvs的点文件比较一下
旋转一下
并没有远离,
假如用下面这个匹配图直接重建会怎么样呢?
这就相差很远了
还有一些函数
//读取一个投影矩阵
void read1Project(string name,Mat &project)
{
ifstream in; //文件读操作,存储设备读区到内存中
in.open(name.data()); //将文件流对象与文件连接起来
assert(in.is_open()); //若失败,则输出错误消息,并终止程序运行
string s;
getline(in,s);
float m1,m2,m3,m4;
for(int i=0;i<project.rows;i++)
{
int j=0;
in >> m1 >> m2 >> m3 >> m4 ;
project.at<float>(i,j++)=m1;
project.at<float>(i,j++)=m2;
project.at<float>(i,j++)=m3;
project.at<float>(i,j)=m4;
}
in.close(); //关闭文件输入流
}
//读取两个投影矩阵
void readProject(string name1,string name2,Mat &project1,Mat &project2)
{
read1Project(name1,project1);
std::cout << project1 << '\n';
read1Project(name2,project2);
std::cout << project2 << '\n';
}
void Gms_Match(Mat &img1, Mat &img2,vector<KeyPoint> &kp1,vector<KeyPoint> &kp2,vector<DMatch> &matches_all)
{
// GMS 过滤器
int num_inliers = 0;
std::vector<bool> vbInliers;
cout << "正在精细挑选匹配:gms " << endl;
gms_matcher gms(kp1,img1.size(), kp2,img2.size(), matches_all);
num_inliers = gms.GetInlierMask(vbInliers, false, false);
cout << "挑选后还有 " << num_inliers << " 个匹配点." << endl;
vector<DMatch> matches_hao;
for (size_t i = 0; i < vbInliers.size(); ++i)
{
if (vbInliers[i] == true)
{
matches_hao.push_back(matches_all[i]);
}
}
matches_all.swap(matches_hao);
}
上面的函数来自网络的各个地方,我就拿了一把剪刀和一罐浆糊,把它们粘在一处。
完整的程序 和资源(图片,投影txt,out等)-->http://download.csdn.net/download/juebai123/10164943
用vs2008 + opencv3.0 编译,高版本vs 应该都可以打开