pmvsPaper pmvs稠密重建论文阅读

1 pmvs文章 Accurate, Dense, and Robust Multiview Stereopsis

1 提出 patch-based MVS algorithm

2 关键词理解

2.1 patch: 估计模型表面的一个tagent平面,更具体的: 3维的一个矩形,其中一边平行于相机拍的图片,范围是55或者77的一个矩形

2.2 Photometric Discrepancy Function 光学差异函数: 用来恢复光学差异小的那些patches

改过程假设照片中物体的lambertian光照环境,R(p)是reference image的意思

2-1

$$g(p) = \frac{1}{|V(p) / R(p)|} \sum_{I \in V(p) \ R(p)}^{} h(p, I, R(p))$$

h(p, I, R(p))是光学差异函数,需要选择出那些满足低于阈值 α 的I然后组成V*(p):

2-2

$$V^*(p) = { I | I \in V(p), h(p, I, R(p))aa \leq \alpha) }$$

替换掉2-1中的V(p)即可,相当于对图像做了一个过滤,得到:

2-3

$$g^*(p) = \frac{1}{| V(p)^* / R(p)|} \sum_{I \in V^*(p) \ R(p)}^{} h(p, I, R(p))$$

2.3 patch优化

每一个patch重建需要2步

  • 1 初始化c(p), n(p), V*(p)以及R(p)
  • 2 优化c(p)和n(p), 将c(p)固定在一个ray上,这样就将自由度由3减少到1,然后n(p)由欧拉角来决定即可,yaw和pitch即可,那么就成为一个无约束最优化问题,则采用共轭梯度法(conjugate gradient)来解即可优化c(p)和n(p)

2.4 image

基于patch去做表面展示的最大优点是很灵活,然而缺少patch与patch之间的链接信息,就不容易获取相邻的patch,解决办法如下:
对于每一张图片,划分成 ββ(β=2在文中)的cell,然后对于每一个patch,它在每个可见图片上都有映射过去的cell,然后上述过程做完以后,每张图片的每个cell都记录了该cell可见的那些个patch,我们记作$Q_i(x, y)$, 同样的,如果是在每个可见图片而且满足#2-3定义的光学差异进行上述步骤,那么就得到$Q_i^(x, y)$

3 patch重建过程

3.1 初始化feature match

3.1.1 采用高斯查分和harris角点来做特征提取

3.1.2 特正匹配和生成atch

  • 1 对于图片$I_i$有光心$O(I_i)$,它里面的每个特征点f,在其它图片中有很多其他对应的特征点$f’$,对于每一个$(f, f’)$点对,那些在他们极线上的特征点,我们组成一个集合F,我们把F中的特征点三角化可以得到对应的3d点,对于这个点的集合,按照其与$O(I_i)$的距离升序排序,一个一个点的尝试去生成patch,生成patch在,直到成功
  • 2 生成patch的过程是在2.3 patch优化阐释的,这里简单复述一下,生成patch就是优化patch的c(p)和o(p)然后使得光学差异函数最小,一旦一个cell生成了一个patch,那么改cell的其他特征点就直接删除不需要了
    生成patch的算法如下:
    pmvs_feature_matching

    3.2 扩展patch

    目的: 对于每一个image的cell $C_i(x, y)$, 至少建出来一个patch,过程如下:

3.2.1 找出相邻的cells来扩展

pmvs_patch_expansion
对于一个p,其在它的第i张可见图片中,而且被$C_i(x, y)$格子记住的patch集合$Q_i(x, y)$中,然后相邻的cells如下获得:

3-1

$$C(p) = {C_i(x’, y’) | p in Q_i(x, y), |x - x’| + |y - y’| = 1}$$
C(p)中需要移除两种类型的cell

  • 1 移除已有patch的邻居cell,具体的: 若,$C_i(x’, y’)$ 包含了一个patch $p’$, 这个p’和p是邻居,那么这个$C_i(x’, y’)$则会被从C(p)移除,具体判断方式见下面的公式:

    3-2

    $$|(c(p) - c(p’))*n(p)| + |(c(p)-c(p’))*n(p’)| < 2\rho_1$$
    $\rho_1$是对应于参考图像R(p)在c(p)和c(p’)的深度时,图像移动$\beta_1$个pixels需要的距离
  • 2*(这一步可以不要,因为图片光学差异的图片过滤过程可以消除这个错误,主要是为了计算效率) 移除深度不连续的邻居cell,从已有的相机去看$C_i(x’, y’)$,得到的深度和从相机去看p的慎独过大,则放弃这种邻居cell,然而实际中构建surface之前,这些个p和$C_i(x’, y’)$可能真实对应的表面间的深度不连续很难判断,所以简单化,也就是若$Q_i^*(x’, y’)$的size大于0,也就证明不连续,也就是当这个$C_i(x’, y’)$这个格子,至少有一个patch是在满足了光学差异达到目标的情况下被他记录,那么它就不需要别的patch来帮他expand,我个人如此理解

3.3 滤除错误的patch

  • 1 过滤可见性不一致的patch,去除深度值不一致且一致性较低的点,意思是如果扩散的点云在其他图特征点的点云前面了,通过比较各自的一致性来剔除;如果扩散点云跑到后边去了,也比较一致性

    3-3

    $$|V^*(p)|(1-g^*(p)) < \sum_{p_i \in U(p)}{1-g^*(p)}$$
  • 2 对于每一个patch,用深度图计算出在$V^*(p)$中可以看到它的图像的个数,如果比$\gamma$要小,那么认为可见图片太少,滤除
  • 3 保证了一个弱正则化,对于每一个patch,收集它所有的可见图片的相邻cells中的所有patches,若这些patches中是邻居patch的比例小于0.25,那么也滤除(考虑到它的相邻patch都不是邻居说明这个patch空间上和邻居不太连续)

<未完待续>