3D 重建返回意大利面结果 SfM 部分表面重建部分

问题描述

我目前正在从事我的毕业项目,多幅图像的 3D 重建。我将项目分为两部分,一部分使用来自运动的结构恢复点云(我正在从 here 学习代码,另一部分从点云生成表面(我正在从 {{3} }).

可以看到我对第一个的实现 this paper 和第二个 here

我猜他们两个都......可以接受?这是点云恢复的工作结果:

here

这是输入图像:

Point cloud restored from multiple images

我想这还不错。如果输入数据集不是来自第一个数据集,例如这个兔子:

Input image

但是,当我将第一个输入插入第二个输入时,我得到的是:

bunny

我完全不知道为什么会这样。我目前的估计是功能不足,但我真的不知道真正的原因,也不知道如何增加可用功能。我在 OpenCV 中使用 ORB,增加功能只会使匹配更加混乱,反过来使结果点云更加混乱。

我已经坚持了好几天了,我将永远感激帮助过我的人。非常感谢!

代码

代码有点长,所以我将在此处发布摘录:

SfM 部分

Result SfM::run_sfm() {
    if (images.empty()) {
        LOG("There is no image to work on.");
        return ERR;
    }
    
    // Initialize feature matcher
    feature_util.init();
    stereo_util.init();
    
    // Initialize intrinsics
    intrinsics.k = (cv::Mat_<float>(3,3) << 2500,images[0].cols / 2,2500,images[0].rows / 2,1);
    intrinsics.k_inv = intrinsics.k.inv();
    intrinsics.distortion = cv::Mat_<float>::zeros(1,4);
    
    camera_poses.resize(images.size());
    
    extract_features();
    create_feature_match_matrix();
    find_baseline_triangulation();
    add_more_views_to_reconstruction();
    
    return OK;
}

表面重建部分

auto Hoppe::run() -> bool {
    if (pointcloud.points.size() == 0) {
        HOPPE_LOG("ERR! Can't run without point cloud");
        return false;
    }

    estimate_planes();

    fix_orientations();
    
    cube_march();

    return true;
}

这是cube_march()

auto Hoppe::cube_march() -> void {
    cv::Vec3f bounding_Box_min,bounding_Box_max;
    calculate_bounds(bounding_Box_min,bounding_Box_max);
    auto size = bounding_Box_max - bounding_Box_min;
    HOPPE_LOG("Bounding Box size: %f %f %f",size(0),size(1),size(2));

    parameters.density = density_estimation(size);

    cv::Vec3i marching_size(ceilf(size(0) / parameters.density),ceilf(size(1) / parameters.density),ceilf(size(2) / parameters.density));
    auto volume = 0;
    do {
        volume = marching_size(0) * marching_size(1) * marching_size(2);
        if (volume > parameters.max_volume) {
            parameters.density *= 2.0f;
            marching_size = cv::Vec3i(ceilf(size(0) / parameters.density),ceilf(size(2) / parameters.density));
        }
    } while (volume > parameters.max_volume);
    
    HOPPE_LOG("marching cube size: %d %d %d",marching_size(0),marching_size(1),marching_size(2));
    marcher.init(marching_size,parameters.density);
    HOPPE_LOG("Estimated: from %f %f %f to %f %f %f",bounding_Box_min(0),bounding_Box_min(1),bounding_Box_min(2),bounding_Box_max(0),bounding_Box_max(1),bounding_Box_max(2));

    marcher.march([&] (cv::Point3f p) {
        return sdf(p);
    },VEC2POINT(bounding_Box_min));
}

如果您提出要求,我很乐意提供更多信息。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)