PMVS原理详解

本文详细解读了PMVS算法,包括面片模型、光度误差函数、朗博面假设、patch优化及重建流程。介绍了Pmvs2相较于Pmvs1的改进,涉及关键概念如面片中心、方向向量、图像模型和可扩展准则。最后概述了Pmvs在计算机视觉中的应用和参考文献。
摘要由CSDN通过智能技术生成

PMVS

一  .首先介绍一下算法中的用到的一些公式与概念

1.1面片模型

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           

大家想象一下我们学微积分时,处理曲线时我们将曲线可以看成一小段一小段的直线,化曲为直来处理曲线。现在我们将这个思想扩展到曲面上,想象一个物体的表面,在充分小的一个邻域内,我们可以用一个规则的矩形来表示那个邻域内的曲面。这个矩形在PMVS中也就叫做面片(p)。

在整个物体表面,每个存在很多面片。我们知道这些面片应该是朝向不同的方向的,想象一下人体模型,我们正面朝向相机,我们后背和前胸的面片就是不同朝向的。所以为了定义面片具体的位置,我们定义面片的方向向量(n(p))与中心点(c(p))。

它存在一个参考图像,这个面片的向量指向参考图像,并且这个面片的一个边是与参考图像相机的x轴平行。

面片的大小规定为,面片投影到参考图像上所占的像素大小为u*u (u通常取5 或7)

总结面片模型 :

P   面片

c(p) 面片中心

n(p) 面片方向向量

R(p) 面片参考图像

1.2光度误差函数

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           

        

定义可视图像集V(P),R(p) \epsilon V(p)  通俗的说就是能够看到面片P的图像集合

定义光度误差函数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

被定义为两两光度差异函数,也就是I1与I2之间的光度误差

      面片p投影到图像1上一个u*u 的点块,对每个点通过双线性插值的方法,计算出对应的像素,然后计算图像1与图像2 对应点块的归一化互相关函数NCC,然后用1-NCC 就得到h。

其中NCC:

        ​​​​​​​        

总结光度误差函数:
                ​​​​​​​        ​​​​​​​        
 

​​​​​​​1.3朗博面

非严谨的解释朗博面假设,就是说我们在不同角度观察一个物体表面,看到的区域在不同角度中光度应该相似。举个例子,玻璃,水面,就是非朗博面、

我们在进行稠密重建时,我们假设是在满足朗伯面的条件下进行的,可是有的面片对应的位置恰好是非朗博面,比如一张山水照中的河流部分。

为了解决这个问题,我们可以通过1.2中讲的光度误差函数来衡量并剔除非朗博面面片。

实际上,在pmvs中并不是忽略面片,而是在可视图像选择过程中,如果一个图像与参考图像R(p)

之间的光度误差h(p,I,R(p))> a 那么就将这个图像在可视集中去除

         ​​​​​​​        ​​​​​​​        

​​​​​​​1.4 patch 优化

我们已经定义了光度差异函数

我们优化的目的是使它最小,来优化n(p),c(p),其中c(p)限制在投影方向上优化,也就是深度方向上。n(p)用欧拉角来表示,只优化它的pitch 俯仰角,yaw 偏航角

这样我们优化的参数实际上只有三个。

                                                          

 1.5 图像模型

 

                                                

基于面片的方法最大的优点就是它的灵活性。然而由于缺乏连接信息,它并不容易去获取搜寻邻域面片。为了解决这个问题,pmvs通过跟踪面片在其可视图像集合中的投影来改善上述问题。

将图像分成一个个的小格子,每个小格子大小为\ss \ast \ss 像素(在pmvs实验中为2*2),小格子定义为Ci(x,y).

给定一个面片p ,和它的可视集V(p),面片投影到他的可视集中每一个image上,然后每个格子Ci(x,y) 记录投影到这个格子上的面片集合Qi(x,y),定义Qi*(x,y)为经过过滤后的面片集合

二. Patch 重建

Pmvs patch 重建分为三个部分分别是:初始特征匹配,面片扩张,面片过滤

重建的目标是:每个图像的cell Ci(x,y)都至少被一个面片覆盖。

特征匹配的目的是为了生成稀疏的面片,这些有的面片可能不是正确的。

面片扩张和过滤需要重复进行n 次,在论文中是迭代了3次。

2.1 ​​​​​​​初始化特征匹配

论文中首先计算每一个图像中的DOG 和Harris 特征点,然后进行特征匹配

在图像I1 上计算的特征点成为f ,在图像I2上计算的特征点称为f’

在f 的对应的极线上搜索与f 为相同类型的特征点,进行特征匹配

匹配后的特征点进行三角化,得到对应的三维点

对面片初始化:

记图像I(i)的相机中心为O(i)

初始化面片的中心为c(p)  三角化特征点得到的三位点坐标

初始化面片的中心为n(p)

                            

我们现在初始重建出来的面片存在很多错误。

我们假设初始化的面片的可视集V(p)为满足以下条件的图像:

    ​​​​​​​        ​​​​​​​        ​​​​ 

角度论文中取60°   (cos 在0-pi/2是减函数,也就是说角度小于60°的视为可视集)

现在我们得到了V(P),我们接下来要通过光度一致性检测在V(p)中筛选V*(p):

        ​​​​​​​        ​​​​​​​        

                                                注意:此时a取0.6

然后我们通过优化:

        ​​​​​​​             

得到优化后的面片p的信息,c(p) n(p)

优化后在通过下列更新一次V*(P):

        ​​​​​​​        

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

                                                        注意:此时a取0.3

如果经过优化后的V*(p)中图像数目大于\gamma时,我们认为重建成功,并且将p存储在对应的单元格Ci(x,y)对应的Qi(x,y) 中

论文中还说:

 Also note that, in

order to speed up the computation, once a patch has been

reconstructed and stored in a cell, all of the features in the

cell are removed and are not used anymore

初始化面片的程序:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

 2.2面片扩张

        2.2.1 可扩张准则

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

当前Patch 被Cell Ci(x,y) 收录,我们称Ci(x,y) 的4邻域 为C(p)(注意这里的C为大写的,不是面片中心c(p))

        ​​​​​​​        ​​​​​​​        

 1.如果Ci(x’,y’)已经被重建过了,那么将Ci(x’,y’)从C(p)中删除

具体来说什么叫做已经被重建过了:如果Ci(x’,y’)中存储一个p’,如果p 与p’ 是邻居,那么就将Ci(x’,y’)从C(p)中删除

怎么算是邻居呢?

        ​​​​​​​        ​​​​​​​        

对于这个\rho我没弄懂什么意思,英语太差了。懂得教我一下。

 \rho is the distance corresponding to an image displacement of  \ss pixels in the reference imageR(p) at the depth of the centers of c(p) and c(p')

2.  如果Ci(x’,y’)中没有邻居面片或者说没有被重建过,但是如果两个cell 的深度是不连续的,那么也不扩张。

     实际上,我们只有重建出来了它才知道是否深度连续。这就是个鸡生蛋蛋生鸡的问题了,所有pmvs 只是单纯的判断如下:

如果Ci(x’,y’)已经包含了一个面片,如果这个面片p’与p的光度一致性差异小于在公式2中定义的阈值a,那么这个cell也不重建,在C(p)中删除

2.2.2 扩张过程

经过扩张准则,现在C(p)中存的都是可扩张的Ci(x,y)

首先在对需要扩张的cell 生成一个新的面片p’  初始化 n(p’) = n(p),R(p’) = R(p)

V(p’) = V(p) 。 c(p’)初始化为,射线(相机原点O(i) 与这次扩张的cell Ci(x’,y’)中心的连线  )与patch p 所在平面的交点   

说的简单,怎么编程实现???不懂!

初始化完事了,通过公式(2)求V*(p’),之后通过优化修正 c(p’) n(p’)

经过优化后我们 为p’ 添加新的可视集 V(p’) ,之后再通过公式二求得V*(p’)

如果V*(p’)中图像个数大于\gamma 则扩张成功,更新QI(X’.Y’) Q*(X’,Y’)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

2.3面片滤波

 

第一个滤波器依赖可见一致性:

设U(p)为与当前可见信息不一致的patch 的集合

P 与p’ 不是邻居 (公式8),但是存储在同一个Cell 中

如果p满足:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

那么p是离群值,将p滤除

第二个滤波器也依赖与可见一致性,但是更加严格:

计算每一个p的可视集数目,如果小\gamma于则滤除

第三个滤波器:

若对一个patch  p ,在他所在的cell 与相邻的cell 中的所有patch进行比较,若p的邻居patch 数低于25% 那么将该patch滤除

 

 

三.  Pmvs2 较pmvs 改进的地方

It should run much faster (five to ten times faster, especially if you use threads), and reconstruct more complete and accurate 3D points. The basic algorithmic framework is the same as the first version described in the publications, but there are many algorithmic differences.

The software can make use of visibility information (which images see common surface points) to speed-up computations. Such visibility information is often available from Structure-from-Motion algorithms, and can be specified through an option file.

The software allows more parameters to be tuned, which can be specified with an option file (refer to the documentation for more details).

也就是说其实与pmvs1 的核心算法是相同的,我们只要学会pmvs 的核心算法与思路就可

 

四. 参考文献

 Accurate, Dense, and Robust Multi-View Stereopsis

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹果香蕉柠檬c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值