【public】借助openMVG、openMVS,使用自己的数据实现三维重建pipeline(SFM+MVS)

5 篇文章 9 订阅
2 篇文章 0 订阅

0、PRE

为确保科研隐私,博客中部分图片已删去,请理解

1、openMVG部分

pre: 参考博客:openMVG原理、编译、源码理解、实践

1.1、实验设计

在这里插入图片描述

1.2、实验分析及代码实现

1.2.1、实验1 (重点分析,详细理解代码)

1.2.1.1、匹配问题
1) 理论分析

目标翻转前后的影像,在匹配时,由于几何约束,例如,采用essential matrix 进行约束,remove掉视图对中的部分点匹配对

  1. 原理:
基于ransac,剔除outlier
在该实验中,前景相对于背景为强纹理,
因此,在考虑翻转前后的影像对的点匹配时,基于几何约束,
将背景中的putative matches 剔除,
而保留前景中的putative matches

PS:!!!强弱纹理,绝对性与相对性

  1. 图例说明

(实验1 image no.19 特征点提取结果 )

(实验1 image no.51 特征点提取结果 )

(实验1 image no.19 --no.51 putative match结果 pairs: 1474)

(实验1 image no.19 --no.51 geometric match结果 pairs: 499)
在这里插入图片描述
(实验1 所有image geometric match结果 geometric graph)

2) 代码实现
  1. 函数接口:
filter_ptr->Robust_model_estimation(
          GeometricFilter_EMatrix_AC(4.0, imax_iteration),
          map_PutativesMatches, bGuided_matching, d_distance_ratio, &progress);

GeometricFilter_EMatrix_AC(4.0, imax_iteration) struct内部:

bool Robust_estimation
  (
    const sfm::SfM_Data * sfm_data,
    const std::shared_ptr<Regions_or_Features_ProviderT> & regions_provider,
    const Pair pairIndex,
    const matching::IndMatches & vec_PutativeMatches,
    matching::IndMatches & geometric_inliers)

Robust_estimation函数内部:

 //--
    // Robust estimation
    //--

// Define the AContrario adapted Essential matrix solver
const auto ACRansacOut =
      openMVG::robust::ACRANSAC(kernel, vec_inliers, m_stIteration, &m_E, upper_bound_precision);

kernel的使用:

step1:

using KernelType =
      openMVG::robust::ACKernelAdaptorEssential<
        openMVG::essential::kernel::FivePointSolver,
        openMVG::fundamental::kernel::EpipolarDistanceError,
        Mat3>;
step2:
KernelType kernel(
      xI, (*cam_I)(xI),
      sfm_data->GetViews().at(iIndex)->ui_width, sfm_data->GetViews().at(iIndex)->ui_height,
      xJ, (*cam_J)(xJ),
      sfm_data->GetViews().at(jIndex)->ui_width, sfm_data->GetViews().at(jIndex)->ui_height,
      ptrPinhole_I->K(), ptrPinhole_J->K());
  1. 重要!!!:Romove overlap较小的视图对

//-- Perform an additional check to remove pairs with poor overlap

在这里插入图片描述

核心:
判断视图对的匹配点数目,以及在geometry filtering过程中remove掉匹配点的比例

  1. 其他代码理解
  • 重要class \ struct
    与匹配有关
    在这里插入图片描述
{ {I,J}, std::move(vec_putatives_matches) }  //{ 视图对, 多个匹配点对}
IndMatches vec_putatives_matches
IndMatches = std::vector<matching::IndMatch>;

在这里插入图片描述

与track 有关

// Data structure to store a track: collection of {ImageId,FeatureId}
//  The corresponding image points with their imageId and FeatureId.
using submapTrack = std::map<uint32_t, uint32_t>;
// A track is a collection of {trackId, submapTrack}
using STLMAPTracks = std::map<uint32_t, submapTrack>;//表示a collection of {trackId, submapTrack},对应于所有的tracks

与2D-3D对应,structure\landmark\track\observation

/// Define 3D-2D tracking data: 3D landmark with its 2D observations

在这里插入图片描述

sfm_data.structure[iterT.first].obs = std::move(obs); //iterT.first: track_id 

在这里插入图片描述

  • 重要!!!进行空三解算的像素坐标(原始输入(feat文件的数据源):以左上方为原点,向右为x轴,向下为y轴)
    在globalSFM过程中涉及坐标转换以及去除变形的操作(计算relative rotation时)
    在这里插入图片描述
 Vec2 get_ud_pixel( const Vec2& p ) const override
    {
      return cam2ima( remove_disto( ima2cam( p ) ) );
    }

源码在提取sift特征及描述时,采用keypoint结构记录结果(position+descr)

在这里插入图片描述
在计算 x\y\i\j时,采用行号与列号:
在这里插入图片描述

1.2.1.2、实验结果

模型底部,即在混合目标两个姿态下的图像后得到的结果中,清晰明了,达到此类目标建模的要求,全方位模型重建,不存在视角遗漏 下图为dense
point 结果截图

1.2.2、实验2

  1. Intrics = 2 (变换背景后,相机内参变化)
  2. 实验结果等同于实验1(原因:因目标纹理强于背景,在翻转前后的影像中,背景间的匹配被过滤掉)

1.2.3、实验3

理想建模情况建模

1.2.4、实验4、5、9

基本建模流程
重点:基于Mesh的模型拼接

1.2.6、实验6

弱纹理目标重建的理想模式(加纹理丰富的背景) 目标:小风扇,属于局部弱纹理(扇叶附近属于强纹理,基座附近属于弱纹理)

  1. 特征点提取:

部分存在空洞,情况不算太差

  1. 匹配:

主要问题是漏匹配 目标上半部分有特征点,但无匹配,下半部分,既无特征点,也无匹配

原因:

Putative match结果:
能提出特征点的目标上半部分,基本呈现误匹配(主要原因,本身就是误匹配),经几何约束后过滤(次要原因),有效匹配基本不存在

(putative match)

(geometric match)

  1. Sfm结果:

目标landmarks 数目较少、只有基本结构点
在这里插入图片描述

  1. Dense point:

弱纹理部分存在明显空洞

  1. Mesh部分:

空洞仍然存在

弱纹理目标—丰富纹理背景,并不能完全解决弱纹理问题, ???疑惑:此种配置,对弱纹理目标建模的改善,体现在哪儿,具体在哪个步骤有所影响

1.2.7、实验7

  1. 匹配:与实验6基本一致,目标本身匹配结果较差
  2. sfm结果:

背景强纹理,目标本身在姿态1、2内外的有效匹配很少,翻转前后的目标重建的效果,等同于同一背景不同放置不同目标,因此,最终的结果是两个姿态(翻转前后)的目标在空间上各自存在,并未融合
在这里插入图片描述

1.2.8、实验8-1

  1. 茶壶数据
  2. 翻转前影像构成的pose-graph 有两个连通分量 Sfm的结果是翻转前或翻转后的其中一个
    在这里插入图片描述

1.2.9、实验8-2

  1. 小风扇数据
  2. 理论上:翻转前后背景、目标对应匹配很少,等效于两组完全且独立的空三解
    实际上:
    在这里插入图片描述
    右上部分理应全部,表示翻转前后“两组”影像无匹配关系------!!!! 用此思路可实现基于匹配结果的图像分组!!!! 但实际上有部分连接匹配【原因如下】)

拍摄背景含有纹理丰富且不改变的物体,例如,沙发.因此,pose graph 的连通分量为1,全部入网,入网率和实验8-1 不一致

在这里插入图片描述
3. sfm:
在这里插入图片描述
4. dense point:

1.3、代码进一步理解

参考另一篇论文:globalSFM

1.4、注意事项

  1. focal length:
    在这里插入图片描述
    上图参考链接

通过exif读取影像f后,根据exif中记录的相机传感器型号,结合sensor_width_camera_database.txt文件获得ccdw数据并计算focal length (pixel)时,若文件中未记录该数据,可自行添加或者修改exif文件(参考链接

  1. 文件路径组织
    在这里插入图片描述
  2. 实验数据准备应注意以下几个问题:失焦、尺度、过近

2、openMVS部分

(还未进一步分析,后续更新)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值