问题描述
我目前正在从事我的毕业项目,多幅图像的 3D 重建。我将项目分为两部分,一部分使用来自运动的结构恢复点云(我正在从 here 学习代码,另一部分从点云生成表面(我正在从 {{3} }).
可以看到我对第一个的实现 this paper 和第二个 here。
我猜他们两个都......可以接受?这是点云恢复的工作结果:
这是输入图像:
我想这还不错。如果输入数据集不是来自第一个数据集,例如这个兔子:
但是,当我将第一个输入插入第二个输入时,我得到的是:
我完全不知道为什么会这样。我目前的估计是功能不足,但我真的不知道真正的原因,也不知道如何增加可用功能。我在 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 (将#修改为@)