举例
一篇文章:shape silhouette fusion for image-based modeling
文章作者Peng Song et al.[2010]
文章基本思想
是由一些已标定图像得到其stereo和silhouette的信息(silhouette信息也是由stereo得到),然后融合两种有向点云 利用泊松表面重建算法(PSR)将有向点云转变成一个完整且精确地三角形网;模型(complete,accurate)
微软的高质量fvv的论文使用其中方法
[High-Quality Streamable Free-Viewpoint Video,2015]
主要用于产生silhouette的深度图方面:
- 产生visual hull 的八叉树
- Mesh 八叉树 (方法:Marching Cubes)
- Project the mesh into with Z-buffered rasterization.
Peng Song文中所述基本步骤:
计算一个visual hull
深度图估计 基于扩张的方法(expansion-based)返回一个3D点云(包含outliers以及冗余信息);剔除outlier,降低scale,估计深度图的表面法向量,生成一个有向点云(来自stereo)
利用这个点云(来自stereo),雕刻其visual hull的八叉树结构,得到另一个有向点云(来自silhouette);merge两种点云,利用泊松表面重建PSR算法将来自stereo和silhouette的有向点云转变成一个完整且精确的三角网;模型。
详细步骤:
Visual hull 及计算方法
计算一个3D边框(3D bounding box)
从一组silhouette和投影矩阵计算3D边框,可以考虑计算每个silhouette的2D边框,并后向投影得到。物体的边框可以由一个优化算法计算[Song, P. 2009](6个变量定义了一个bounding box,分别是x, y, z的最大;和最小;)
Visual hull八叉树的建立
开始于一个体素(voxel),即上一步中的3D边框。然后将voxel分为3类:
处于visual hull内;
在visual hull边界上;
在visual hull外部。
只有内部和边界的voxel才能细分,直到达到最大细分层数。
判断一个voxel类型的基本方法:
使用gift wrapping算法(Jarvis, R.A.1973)计算voxel的8个顶点的投影的凸壳(convex hull),一旦在每张silhouette图上的精确投影计算完成,然后通过确定voxel的投影与所有silhouette的相对位置来判断voxel的类型。(Since the projection of the voxel is a convex polygon, our approach evaluates the relative
position of the projection to the silhouette by a scan processor that tracks only the right and the left edges from the top to the bottom of the projection.)。
判断方法:
如果多边形内所有像素都在目标区域内部,则多边形在silhouette内部;
如果多边形内所有像素都在目标区域外部,则多边形在silhouette外部;
其他情况,多边形与silhouette相交。
于是提出了一个projection test算法判断:
其中,等;函数isosurface function表示3D点到visual hull表面的3D距离,关系:负→内,正→外。
该projection test算法利用voxel的8个顶点的isofunction的;来降低计算量:当8个顶点中的一部分在visual hull外部,则无必要将voxel投影到所有的silhouette image上去即已知其类型。
Visual hull mesh的提取
方法:Marching Cubes算法。
至此,生成的visual hull 将有两个作用:
从multi-view stereo生成深度图
通过PCST(stereo点云)雕刻该visual hull 八叉树生成PCSL(silhouette点云)
在微软文中所述到marching cubes一步之后,用显卡渲染直接得到深度。
接下来介绍Song的其余部分:
Shape信息(有向点云,来自stereo)
- 深度图估计(基于扩张方法)
首先将每张图片划分成许多小窗口,固定大小M*M
使用贪婪方法(greedy approach)计算窗中心像素的深度;
如果发现一个深度;,其置信度高于一个门槛thres2,则将该深度;作为这个窗口的参考深度。对一幅图的所有参考深度;使用median-rejection方法排除明显的outliers。
由于选择的深度;都是置信度比较高的,因此很多窗口可能没有参考深度;,特别是一些没有或者很少纹理的表面。- 对于无参考深度;的窗口,由其相邻3*3的窗口计算其参考深度。
通常如果该窗口的相邻窗口数多于一个固定的数a(这里取得a=4),则用其相邻窗口的深度;计算其深度(中;)。该过程对所有的窗口迭代5次。
可以看到这一步之后点云明显稠密一些。
- 对扩展窗中的每个像素,从深度间隔(由参考深度定义)中以一个固定的长度d搜索其深度;(search the depth values for all the pixels in the window from a depth interval with fixed length d centered at the reference depth along the optical ray)
扩展窗大小M*M取决于输入图像序列的分辨率,thres2仅取决于纹理状况。D取决于重建物体和扩展窗的大小,通常在重建物体大小的1%到2%。
融合这些深度图,得到一个点云。对每个点云中的3D点,其置信度和视点方向均被存储。
具体算法过程如下:
点云的cleaning和downsampling
Cleaning过程:
合并重建目标的visual hull,作为一个约束,来剔除out of visual hull的3D点。
从估计的点云中建立一个表决树,选择一个门槛thres3去排除不相关点。
对每个voxel,计算该voxel中的individual correlation scores之和,与门槛分数比较。
下采样过程:
主要是在每个voxel中提取置信度最高的一个点,达到下采样的目的。
- 表面法向估计
利用主成分分析PCA
选择两个参数定义一个给定点的领域,一个固定的半径R和点数目N,使用一个KD-Tree 有效计算k紧邻问题。
确定表面法向:
通过该点的视点方向 和表面法向 的点积
进行选择:大于0,则表面法向的方向与相同;小于0 ,相反。
输出为一个有向点云:PCST。
使用PSR,问题:无纹理或者纹理很少的区域、非连接区域难以恢复。
Volumetric stereo and silhouette fusion
生成另一个visual hull上的有向点云,表示为PCSL。
方法:将visual hull 八叉树结构的voxel,根据其相对于PCST的点的相对位置分成三类:
Type 1:该voxel包含一个或者一些PCST中的3D点
Type 2:该voxel位于PCST中的3D点和该点的参考图的光心的连线上
Type 3:所有剩余的voxel。事实上,大部分都是纹理很少的区域或闭塞表面区域。如下图所示(figrue9. a)在这些剩余的voxel中,提取visual mesh的顶点和法向来重建PCSL(figrue9. b)。
计算方法如下图所示:
联合来自stereo和silhouette的形状信息(通过融合PCSL和PCST两种点云),用PSR方法转变成一个三角网;模型。
在PCSL计算好后,加到PCST上,生成一个更完整的点云,表示为PCSTSL。再用PSR算法,将有向PCSTSL转化为一个三角网;模型。如下图所示
[附]关于文中greedy approach:
输入:一个已标定图像序列和目标的visual hull
对每个image,选择其k个相邻视点使用鲁棒的窗口匹配关联。
对中的每个像素p,从该物体的visual hull计算一个深度间隔(depth interval),即visual hull内p的后向投影(back-projected)光线
重投影该深度间隔到已选择的相邻视点,计算一个m*m的窗口(中心为p)与不同图像上的窗口(中心为p的投影)标准互相关;NCC(normalized cross-correlation),
对于一个给定的深度间隔,其与在不同image上的投影相关,由极线约束(epipolar constraint),这样不同视点的所有相关曲线都可以关联到一个单独的坐标系统中。
一旦相关曲线被计算出来,则最优深度从中选择:在k个紧邻视点中,对于至少两个视点,其NCC;高于一些门槛。
注意:对中的每个像素p,最优候选深度从最大化NCC;的深度;中选择。若未发现有效深度,则无最优候选深度(none)。