OpenMVS学习笔记(一)稠密重建之数据准备


稠密重建

  • 代码整体框架:

输入:图像,位姿,稀疏点云

输出:depth,稠密点云

  • 深度图计算(ComputeDepthMaps)

    • 代码流程图:

    • 数据准备:

      • 图像映射:imagesMap用来存放所有输入的图像中哪些帧时是可用的,不可用就是no id; data.images存放的是一个用来计算深度图图像ID的list。

      • 坐标系转化:世界坐标系到相机坐标系的转换

      • 邻域帧选择

 

        • 选择策略:共视点f在两个图像V,R的夹角w_n,f在两个图像中分辨率的相似性w_s,f在两个图像中覆盖的面积的最小值area分数计算如下式

 

        • 思考1:为什么选择这三个条件?
          • 1.两个view的靠的越近,越不能提供一个足够大的baseline来重建高精度模型,因此,通过共视点夹角来间接判断两个view的baseline是否足够大;
          • 2.两个图像的分辨率如果差别比较大,立体匹配时是有问题的。所以选择邻域帧,与当前帧分辨率是否一致也是一个重要的因素;
          • 3.重建时,图像的分辨率越高重建的效果越好,故以共视点覆盖的图像面积也作为重要参考条件。

 

        • 思考2:第一个参数计算公式如何理解?

          • 角度阈值a_{max}默认10,角度低于这个值分数越低,2次方的目的是为增强角度下降带来的影响。这个公式中并没有用对角度远大于10做限制,原因是特征点计算时已经对大角度处理过了,角度比较大时是没有共视特征点的。

 

      • 最佳邻域帧选择

 

        • 在我们上一步的计算中,每张图像都选出nMaxViews个邻域帧,我们现在需要给每张图像选择一个最佳邻域来求解深度图。故现在求解的问题是:
          • 每个view(node)都有n个邻域(label),优化目标是给每个node选择一个label使得整体能量最小,这个label就是我们最终给每个view分配的最佳邻域帧。这个问题就是马尔科夫随机场的labeling问题(能量优化问题),其原理我们后续在纹理贴图讲解给每个face选最佳view的时候统一介绍,本节只介绍如何调用。
          • 这个能量最小优化问题能量函数构造如下:
            • Markov Random Field能量函数:公式中Y是标签 (label),X是节点(node).UnaryCost:之前计算的score,用平均score归一化后的值。
            • UnaryCost = avgSocre/neighbors[k].score
            • PairwiseCost:惩罚两个node的label相同的情况即不鼓励任意两个的view的邻域相同。如果两个相同,则给一个很大的值。
          • 求解方案:
            • 方案一:TRW:Tree - reweighted Message Passing
            • 方案二:BP:Belief Propagation
            • 参考论文:convergent tree-reweighted message passing for energy minimization


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM