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的算法如下:3.2 扩展patch
目的: 对于每一个image的cell $C_i(x, y)$, 至少建出来一个patch,过程如下:
3.2.1 找出相邻的cells来扩展
对于一个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空间上和邻居不太连续)
<未完待续>