对VR 球幕的三维重建的研究
2019-03-04张健
张健
(四川大学计算机学院,成都610065)
0 引言
目前,单目三维重建领域的研究已经比较成熟,主流的方法都是先通过效果比较好的特征匹配算法(如SIFT)对图集进行特征计算,然后根据计算的特征点进行特征匹配、用RANSAC 算法进行误匹配剔除,然后对匹配好的特征点通过三角化计算空间中三维点的坐标。整个过程配以非线性优化计算,对内参、外参、路标点进行非线性优化[1]。多图集的重建过程中,主要是采用两种重建方法,一种是增量式重建,另一种是全局重建。目前主流的还是增量重建。在单目三维重建领域有很多优秀的开源库可以使用,并提供了全面的文档注释,方便自定义扩展。在SFM(Structure From Motion)生成点云领域的常见开源库有:Bundler、MVE、openMVG、VisualSFM。在表面构建和纹理生成领域常用的开源库有:openMVS、MVE、MeshLab 等。学习研究这些优秀的开源库,能有效提高对三维重建领域成熟实现方案的理解,对提高算法和工程水平大有裨益。本文将基于openMVG+openMVS 开展研究。
1 基于openMVG+openMVS的重建流程
在三维重建开源库中,openMVG+openMVS 虽然有配置繁琐,代码量过大的缺点。但其功能强大且全面,支持多种自定义的拓展选择,具有完备的代码注释,重建效果优秀等优点使其成为业界非常成熟的重建方案。本文将在此开源库的基础上开展工作。
openMVG 主要用来做SFM,通过多视角拍摄得到图集,构建出稀疏点云或稠密点云。openMVS 在open-MVG 的基础上,对生成的点云进行表面和纹理重建,得到真实的模型。基于上述流程可以实现从拍摄物体得到图集到最后得到物体的三维模型的转变。简要流程如图1 所示。
图1
如图1 所示,在单目多视角拍摄的三维重建中,特征提取与匹配起着至关重要的作用,但是球幕系统有其特殊性,球幕整体上是一个不规则的半球型幕布,通过多通道投影仪投放相同的图像到幕布上后进行校正处理,得到所要显示的图像。所以,如果直接对球幕进行单目拍摄,则只能拍摄到没有任何特征点可以提取的白色光滑幕布,无法进行特征提取,也自然无法进行单目拍摄重建工作。解决办法也比较直接,在光滑幕布上投影出一些图案,这样拍摄到图像就会是投影出的图案,而图案显然具有大量特征信息,可以用于特征匹配和单目多视角拍摄的三维重建。此时,一个新的问题自然显现出来:“应该给球幕投影什么样的特征图案能获得最好的重建效果呢?”。显然,投影不同的图案会拍摄到不同的特征,不同的特征会产生不同的重建效果,针对这个问题的研究的内容,放到了本文后面的第二节讨论,此节着重讲解重建流程。
首先,通过多视角拍摄物体得到了一系列球幕图片的图集,得到原始数据。
然后,ImageListing 处理需要对图集进行处理,主要包括:①获取相机信息和图片信息,②构建sfm_data的数据结构并完善图片集views 的信息与内参intrinsics 的信息。
对于相机信息,主要需要确定相机的畸变模型和焦距。相机都会存在畸变,主要来自于两方面,一是由于相机都会采用透镜,而透镜会对光线传播造成影响,引发畸变,这种畸变称为径向畸变。二是由于相机在组装过程中必然存在着机械误差,造成透镜与成像平面不是完全平行的现象,也会产生畸变,此类畸变称为切向畸变。一般在考虑相机畸变时,只考虑径向畸变。径向畸变主要分为两种,一是桶形畸变,二是枕形畸变,此处不做详细解释。由于透镜基本都成中心对称,所以通常径向畸变会呈现径向对称。常用如下多项式函数进行径向畸变的校正。
如不考虑畸变,则为经典的Pinhole 相机模型;图像中心区域的畸变,畸变小,主要是k1项起作用,而对于畸变稍大的边缘区域,则主要是k2项起作用,如只考虑k1和k2项的畸变,则为Pinhole radial 1 相机模型,普通相机一般采用这种相机模型;对于畸变非常大的摄像头,例如鱼眼摄像头,则需要加入k3系数来纠正畸变,此为Pinhole radial 3 相机模型,本文采用此种相机模型,能最大限度纠正畸变。在IncrementalSFM 处理过程中采用非线性优化的方法来计算k1、k2、k3三个系数是本文采用的畸变校正方法。
对于图片信息,主要为获取图片EXIF 信息计算相机内参,通过EXIF 信息可知,图片分辨率为5184×3456,物理焦距为18mm。查阅资料可知,Canon EOS Rebel T2i 型号的相机的传感器宽度为22.3。综上可知,内参Cx和Cy分别为2592.0、1728.0。内参fx和fy可通过如下公式计算得出:
自此,内参矩阵的四个未知数均已知。
对于构建sfm_data 的数据结构并完善图片集views 的信息。本文的过程中有4 种重要的数据需要保存在sfm_data 中,分别为views 图集信息、图集对应的内参信息、图集对应的外参信息、3D 路标点以及能观测到该路标点的各个2D 图像点信息。在ImageListing 中,负责完善图集的路径设置,编号,与内参外参编号对应的相关信息,并计算好内参信息。
之后,computeFeatrues 主要负责计算各个图片的特征子和描述子。因为本文不在乎特征计算的实时性,所以应选取效果最好的特征匹配算法。主流可选的方法通常为SIFT 与AKAZE,这两种方法各有优劣,本文采用使用面比较广的SIFT 特征匹配算法来开展工作[2]。
SIFT 特征匹配的实现原理此处不做赘述,对图集中的每张图片进行SIFT 特征计算生成feats 文件和descs 的描述子文件。
然后,computeMatches 主要利用计算好的feats 和descs 计算特征匹配。对于数量为n 的图集,两两配对会有次配对计算,为保证重建结果的准确性,不采用NNS、KNS 等临近匹配算法,直接采用Brute force 暴力法计算欧氏距离,然后采用RANSAC 算法剔除误匹配的数据,将所有两两图片计算出来的匹配信息通过特征点id 对的方式表示,统计成match 数据[3]。
最后,综合以上各种信息,进行incrementalSFM 增量重建。增量重建是一个比较复杂的过程,是整个重建过程的核心。大致可以分为以下四步:
(1)利用并查集建立轨迹数据,具体做法为将所有图片的feats 数据<imageid,featid>全部放入一个set 集合中,建立并查集初集,然后遍历match 数据,若两个图片对应的feat 匹配,则将这两个feat 数据在并查集中并起来,遍历过程中不断更新并查集。最后并查集一个根下的所有子节点构成了一个track,不同子节点代表了观测到了同一个空间点的不同图片的二维观察点。一个track 就对应一个空间点的所有位于不同图片的二维观测数据。
(2)建立初始点云,通过五点法或八点法初步计算每副图像的外参位姿,从中选择出方向向量夹角最大即基线最大的两幅图像构成初始匹配图像对。获得了初始匹配图像对之后,以计算的初始外参和特征点对计算三角化,获得空间3D 点的坐标。因为特征点数据远远多于五点、八点法的需要,将其他众多特征点用于非线性优化的数据,利用ceres 进行非线性优化运算,优化对象为整个重建过程用到的所有数据:内参、外参、畸变参数,3D 空间点坐标,最后得到一个比较准确的结果,众多空间3D 点构成了初始点云。
(3)开始增量重建过程,每次从剩下的图集中选一个相关点最多的图片,与现有的场景点云进行增量融合,更新现有的场景点云,不断增量更新场景,使得场景越来越完善。
(4)融合场景大致分为以下六个步骤:①对于当前图片,对应一个view_id,获取所有tracks 中含有view_id 的所有track 数据,把所有满足条件的track 放入一个set 中。②获取现有场景中的所有tracks 并放入到另一个set 中。③计算两个set 中的相同的tracks,放入另一个set 中。④把共同tracks 中在该view_id 下的二维点数据收集起来。⑤对于共同的tracks,现有场景中已有其对应的3D 空间点,此时,已知3D 点与对应的view_id 下的二维点数据,利用PnP可求解出view_id 的位姿[4]。⑥遍历view_id 对应的图片中的每个点对应的track,如发现现有的重建场景中没有该track,则遍历该track 的所有子节点<view,feat>对,找一个已经出现在重建场景中的view_j,让view_id与view_j 做三角化得到新的空间点,将该空间点更新添加到现有场景。通过以上七个步骤,完成增量重建的场景融合过程,得到完整的场景数据。
2 对球幕三维重建特征纹理的探究
上节提到,球幕本身只是一个光滑的白色幕布,没有特征纹理可供重建计算,但给球幕投影不同的图案会拍摄到不同的特征,不同的特征会产生不同的重建效果,采用何种特征纹理可以获得最好的重建效果是一个重要的研究内容。
如需探究不同特征纹理会对重建结果产生何种影响,首先需要合理设计对照纹理,对照纹理需要具有代表性,能代表不同类型的局部特征。通过详细了解众多特征匹配算法,如SIFT、SURF、AKAZE 等,可以发现特征匹配算法本质上都是寻找具有代表性的局部特征。所以,需要设计的特征纹理能代表不同类型的局部特征具有重要意义。
通过对各式特征图案分析发现,特征图案大致可以分为如下三类:①网格类,②线条类,③散点散斑类。其中,网格类有规则网格(如棋盘格),不规则网络(三角网格)等,网格类图案特征容易在交点处、格区中心、网格线上找到角点。线条类主要有不规则封闭曲线(如等高线),折线类(如高斯噪声折线图)等,线条类图案容易在孤立线条上、线条密集且有较大曲率变化处产生角点。散点散斑类,基本都由较独立的零星小图案构成,图案变化非常多样,如各种散斑图,此类图案容易在独立的小图案处捕获到角点。
针对以上三类特征图案,设计了8 种不同的特征图案做对比实验。网格类有四种:①棋盘格,②符号网络,③二维三角网格,④三维三角网格;折线类有两种:①等高线图,②高斯噪声折线图;散点散斑类有两种:①散斑图,②高斯散点图。特征图案如图2 所示。
图2
通过在球幕上分别投影以上图案,获得不同的多机位拍摄图集,采用openMVG+openMVS 重建流程进行单目三维重建,得到如图3 的结果。
通过对以上的不同特征及其重建结果对比分析,能获得关于选取特征纹理的诸多信息。这些信息将能有效帮助选取合适的特征纹理用于三维重建。
通过分析三维三角网络的重建结果可以发现,其重建模型的空洞缺失最严重,不难发现,三维三角网络的纹理特征有明显的特征未填充区域,这将导致其在特征匹配时会有部分区域完全没有特征点被捕获,导致无法三角化出三维空间点,造成模型缺失。所以,在设置特征纹理时,必须要填充满屏幕,否则会造成空洞。
图3
横向对比网格组的四种不同特征的重建结果,可以发现,符号网格、棋盘格、二维三角网格因为特征几乎都填满屏幕,三维重建的结果均无明显模型缺失。但符号网格特征的重建模型的表面面片明显有凹凸不连续的感觉。在棋盘格特征的重建模型上这种凹凸不连续感较符号网格要好上许多,而二维重建模型则显得最光滑。分析符号网格特征的特点不难发现,其特征主要集中在网格交汇点与网格中心的随机生成的字符上,而整个网格内的其他区域则为大片的空白,这将使得在独立的单元格内只有边缘和中心的字符上有特征点被捕获并三角化成三维空间点,而单元格内的大部分空白区域将没有任何点可以为重建模型提供点云数据,造成了点云数据的分布不均匀,每个单元格内都有空白缺失,导致最后表面重建时出现凹凸不连续的面片感。所以,在设置特征纹理时,应该要选取尽量均匀的特征纹理,保证纹理的特征点不会只出现在特定的边缘、中心上,而是全局均匀分布,这样可以避免重建模型出现凹凸不连续的面片感。而继续分析棋盘格的重建数据可以发现,棋盘格的纹理特征与符号网格非常相似,特征点也只会出现在交点和单元格中,既然纹理特点非常相似,为何会出现棋盘格重建模型凹凸不连续感比符号网格要弱的现象?仔细对比两种特征,不难发现,棋盘格的特征密度要明显高于符号网格,这是导致凹凸不连续感明显减弱的主要原因。对于二维三角网格,其重建模型表面最光滑,仔细分析其纹理特征可知,其纹理主要有两个优点,一是密度较高且均匀分布在整个图片,二是其特征纹理的三角网格由随机坐标点经过Delaunay 三角化生成,三角网格中的三角形形态不一,使得特征点变得多元化,减少了相似纹理的误匹配可能。
横向对比线条类的两种不同特征的重建结果,可以发现,线条类的特征图案的凹凸不平感均较明显。分析其SIFT 特征计算结果可知,线条类的图案的SIFT特征点主要集中在孤立线条上、线条密集且有较大曲率变化处,这使得线条类的特征图案均有一定的特征点热点区域,导致特征分布不均匀,而特征点不均匀区域容易造成表面重建时的凹凸感。另外,线条类的图案的特征点往往不够明显,即使采用较大的图案密度也无法捕获到足够的特征点,且特征点基本都出现在线条上,导致大量的非线条区域无法捕获到特征点,导致特征缺失。
横向对比散点散斑类的两种不同特征的重建结果,可以发现,两种散点散斑类的图案的重建结果均比较完整且光滑,分析其图案特征不难发现,散点散斑类的特征图案的局部特征明显,单个独立的散点和散斑容易被识别,散斑分布均匀且密度较高,使得这类纹理特征具有良好的重建效果。但对比发现,散斑图的图案密度明显高于高斯散点图,但实际重建结果却没有高斯散点图光滑。出现这个反常结果的可能原因有两个,一是散斑图案的特征相似度比散点图要高,导致散斑图案比散点图案出现更多的误匹配影响重建的效果,二是散斑图案可能过于密集,导致特征重叠,出现了反效果。通过两种重建结果的SIFT 特征计算与分析,发现两种特征图案经过SIFT 特征点计算后,散斑图案的SIFT 特征点数量明显要大于散点图案,但散斑图案的特征点重叠程度却明显高于散点图案。特征点多的散斑图案通过特征匹配计算出来的成功匹配数却比散点图案还要少,其原因主要是特征点多的散斑图案存在大量的特征点重叠与误匹配,在去除误匹配的过程中被大量剔除,导致最终的匹配成功特征点数量反而更少。所以,在设置特征纹理时,应避免特征信息过于密集,导致特征信息出现大量重叠堆积,反而造成重建效果变差。另外,应避免特征的相似度过高,当相似特征点达到一定密度时会导致特征点被大量误匹配剔除,造成重建结果的点云数量变少,影响重建结果。
综上所述,分析重建结果可知,重建结果较优秀的是网格类的二维三角网络特征图案和散斑散点类的高斯散点图特征图案,因此,推荐使用合适的网格类与散斑散点类的图案用于球幕的三维重建,分析上述优秀特征图案的特点,得到如下结论,在为球幕选择适合的三维重建纹理时,需满足以下几点:①在设置特征纹理时,要尽量让特征纹理填充满屏幕,避免产生空洞现象。②特征图案的密度要比较高,能获得更多的三维空间点,但不能密度过高,密度过高会导致出现大量的特征重叠,反而影响匹配效果。③特征图案能捕获到的特征点应该尽量分布均匀,使得生成的三维模型的点云分布均匀,模型过渡自然。④避免特征图案计算出的特征点相似度过高,导致误匹配几率变大。
3 结语
本文首先介绍了球幕这种较特殊的三维重建对象的特点以及当前单目拍摄三维重建领域的研究现状,进而详细说明了基于openMVG+openMVS 开源库的三维重建流程。最后,根据球幕的特点,对究竟什么特征纹理最适合用于球幕三维重建进行了探究。本文对一个新的特殊三维重建对象“球幕”进行了单目拍摄三维重建的研究,并结合了当前功能最强大的开源库辅助进行三维重建研究,弥补了对球幕三维重建研究的空白,并为类似于球幕这类本身没有特征可供提取的物体的三维重建工作提供了重要参考依据。