int main(int argc, char *argv[]){
/** 加载归一化后的匹配对 */
sfm::Correspondences2D2D corr_all;
std::ifstream in("./examples/task2/correspondences.txt");
assert(in.is_open());
std::string line, word;
int n_line = 0;
while(getline(in, line)){
std::stringstream stream(line);
if(n_line==0){
int n_corrs = 0;
stream>> n_corrs;
corr_all.resize(n_corrs);
n_line ++;
continue;
}
if(n_line>0){
stream>>corr_all[n_line-1].p1[0]>>corr_all[n_line-1].p1[1]
>>corr_all[n_line-1].p2[0]>>corr_all[n_line-1].p2[1];
}
n_line++;
}
/* 计算采用次数 */
const float inlier_ratio =0.5;
const int n_samples=8;
int n_iterations = calc_ransac_iterations(inlier_ratio, n_samples);
// 用于判读匹配对是否为内点
const double inlier_thresh = 0.0015;
// ransac 最终估计的内点
std::vector<int> best_inliers;
std::cout << "RANSAC-F: Running for " << n_iterations
<< " iterations, threshold " << inlier_thresh
<< "..." << std::endl;
for(int i=0; i<n_iterations; i++){
/* 1.0 随机找到8对不重复的匹配点 */
std::set<int> indices;
while(indices.size()<8){
indices.insert(util::system::rand_int() % corr_all.size());
}
math::Matrix<double, 3, 8> pset1, pset2;
std::set<int>::const_iterator iter = indices.cbegin();
for(int j=0; j<8; j++, iter++){
sfm::Correspondence2D2D const & match = corr_all[*iter];
pset1(0, j) = match.p1[0];
pset1(1, j) = match.p1[1];
pset1(2, j) = 1.0;
pset2(0, j) = match.p2[0];
pset2(1, j) = match.p2[1];
pset2(2, j) = 1.0;
}
/*2.0 8点法估计相机基础矩阵*/
FundamentalMatrix F;
calc_fundamental_8_point(pset1, pset2,F);
/*3.0 统计所有的内点个数*/
std::vector<int> inlier_indices = find_inliers(corr_all, F, inlier_thresh);
if(inlier_indices.size()> best_inliers.size()){
// std::cout << "RANSAC-F: Iteration " << i
// << ", inliers " << inlier_indices.size() << " ("
// << (100.0 * inlier_indices.size() / corr_all.size())
// << "%)" << std::endl;
best_inliers.swap(inlier_indices);
}
}
sfm::Correspondences2D2D corr_f;
for(int i=0; i< best_inliers.size(); i++){
corr_f.push_back(corr_all[best_inliers[i]]);
}
/*利用所有的内点进行最小二乘估计*/
FundamentalMatrix F;
calc_fundamental_least_squares(corr_f, F);
std::cout<<"inlier number: "<< best_inliers.size()<<std::endl;
std::cout<<"F\n: "<< F<<std::endl;
std::cout<<"result should be: \n"
<<"inliner number: 272\n"
<<"F: \n"
<<"-0.00961384 -0.0309071 0.703297\n"
<<"0.0448265 -0.00158655 -0.0555796\n"
<<"-0.703477 0.0648517 -0.0117791\n";
return 0;
}
相机模型(三维重建-------3【任务3】代码)
猜你喜欢
转载自blog.csdn.net/weixin_43384504/article/details/104294155
今日推荐
周排行