陈占军 林姚宇 龚咏喜 王耀武 顾照鹏
1(哈尔滨工业大学(深圳)建筑学院 广东 深圳 518055)2(哈尔滨工业大学(深圳)深圳市城市规划与决策仿真重点实验室 广东 深圳 518055)3(腾讯科技(深圳)有限公司 广东 深圳 518052)
Marr视觉计算理论[1]将计算机视觉分成自上而下三个阶段,从最初的原始数据即二维图像到最终对三维环境的表达经历了三个阶段处理,事实上这也是三维重建过程的三个阶段。从二维图像恢复三维物体可见表面的几何结构即三维重建是计算机视觉研究的主要目的之一。
基于视觉的三维重建[2-3]即结合多视角几何理论和视觉算法理论,运用立体匹配[4]、语义目标分割[5]及相关优化算法[6]等从若干幅二维图像计算物体或场景的位置、形状等几何信息,恢复其三维模型。而二维图像上每一点的位置与空间物体表面相应点的几何位置有关,这些位置的相互关系则由摄像机成像几何模型所决定。总的来说,实际意义上的基于图像特征视觉的三维重建过程包括三个步骤:(1) 二维图像特征匹配,即从不同视角的图像中检测对应同一空间点的二维图像特征点,包括SIFT特征[7]、Harris特征[8]、SURF特征[9]等,并进行特征匹配;(2) 摄像机标定[10]即计算摄像机的位置姿态包括内参数矩阵和外参数矩阵;(3) 根据上述图像匹配和摄像机标定的结果,获取物体可见部分的三维空间结构。
视觉系统的研究是计算机视觉研究发展的趋势,针对实际应用需求开展三维重建系统的研究具有重要价值。由于古建筑多为木质结构,并且辅以彩绘和雕刻,通常结构复杂精巧,使得对其保护面临巨大挑战。对中国古代建筑进行三维数字化保护是对中国建筑精髓传承和文物保护的重要手段。近年来,基于图像视觉的三维重建技术在古建筑和文物的数字化保护方面的应用需求越来越多,其中一个主要应用是对古建筑的数字化建模研究。屠大维等[11]提出了一套古建筑中文物的数字化三维重建系统,即结合摄像机拍摄图像和线激光扫描的方法,并对系统测量误差进行标定和补偿,实现了文物的三维数字化。杜国光等[12]结合了3DSMax和SketchUp人工图形学建模方法,通过构建古建筑的基础模型,进行三维模型检索,再结合三维重建最终获取古建筑的三维结构。康停军等[13]采用GIS、三维激光扫描技术对历史建筑进行信息采集、表达,不仅获取了历史建筑的点云数据和三维模型,还制作了历史建筑的平面、立面、剖面及大样图,建立了基于“一张图”的历史建筑信息化管理及应用体系。
上述针对古建筑的三维重建方法分别应用了激光扫描、人工图形学建模、测绘等复杂技术或采集手段。由于激光扫描涉及到比较昂贵的设备成本,测绘手段则受古建筑现场地理环境的制约,而人工图形学的预先建模方法更是制约了古建筑三维重建模型的自动生成。以上方法的缺点都或多或少地限制了现实中古建筑的三维数字化应用需求的实现。
本文设计并实现的古建筑视觉三维重建系统面向古建筑的三维数字化应用需求,应用视觉三维重建技术,实现从多幅不同视角的且无序的古建筑图像序列到三维模型的自动生成,通过初始特征提取和匹配、摄像机位置姿态计算、图像面片匹配及纹理映射计算等过程得到最终三维重建结果,整个过程无须人工干预。与其他古建筑的三维重建或三维数字化方法相比,本文贡献在于:(1) 本文系统运行之前无须对摄像机参数进行预先标定,也无须预先校正原始图像序列[14];(2) 三维重建过程中对摄像机位置姿态和稀疏三维点云的计算都进行了优化,减少了匹配错误和误差累计,从而提高了三维重建的准确率;(3) 无须预先人工建模,且系统设计和实现的成本低,操作简单、可实施性强,只需要一台单反摄像机采集图像序列,就能获得视觉效果较好、场景真实感较强的古建筑三维重建效果,系统应用范围较广,基本满足目前古建筑数字化的需求。
与室内场景图像相比,室外的古建筑场景图像的三维重建系统一直是计算机视觉领域的一个技术难题。其算法设计关键是在有效恢复场景深度信息的前提下,实现整个三维重建过程的自动化,同时结合优化过程提高摄像机参数计算的准确性和三维重建视觉效果。
本系统设计运用的算法步骤如下:
步骤1用单个摄像机进行拍摄,采集获取不同视角的古建筑的多幅图像;
步骤2对古建筑图像序列进行特征提取,并进行特征匹配,得到种子匹配点;
步骤3以图像序列中的种子匹配点为基础,在种子点的邻域内进行扩散,获取数量更多的新匹配点;
步骤4根据上述特征匹配的结果,计算图像拍摄时刻的摄像机位置姿态和古建筑的稀疏三维点云;
步骤5根据图像拍摄时刻的摄像机位置姿态和古建筑的稀疏三维点云,利用多视角立体匹配算法获取古建筑稠密三维点云;
步骤6根据古建筑稠密三维点云,生成古建筑三角面片模型;
步骤7利用古建筑三角面片模型,根据三维点与图像的匹配关系,计算纹理映射并生成古建筑三维模型。
步骤1利用定焦摄像机从不同角度采集古建筑的多幅图像,摄像机的运动方向要保持水平移动,保证每一个图像细节至少有两幅图像覆盖。步骤2提取SIFT特征,并进行匹配得到种子匹配点。步骤3采用文献[15]方法对种子匹配点进行扩散,得到准稠密匹配点。
步骤4包含以下4个子步骤,其中S表示古建筑图像集合,Ps表示三维点云集合,S1表示已计算的摄像机位置姿态的图像集合,Q为摄像机姿态集合。
(1) 利用文献[16]的标定法计算定焦摄像机内参数K。
(2) 选取匹配点最多的两幅图像I0、I1,令I0的姿态为T0,T0=[I,0],其中I为三阶单位阵,0为三维列向量,利用八点算法[17],计算I0和I1之间的相对刚体变换T1,将I0和I1加入集合S1;利用T0、T1及图像匹配结果,应用三角测量原理计算立体匹配图像的深度值,从而得到三维空间点,将三维点加入集合Ps;将T0和T1加入集合Q。
(3) 对于S-S1中的其他图像Ii,查找Ii与S1中图像匹配点最多的图像Ij,获取Ii与Ij的匹配点集Pij,根据已重建三维点的位置,计算Ii相对于I0的刚体变换Ti,同时计算Ii与S1中其他图像的匹配点的三维位置并加入集合Ps,将Ti加入集合Q。
(4) 对于所有计算获得的摄像机姿态集合Q及三维点集合Ps,利用Kümmerle等[18]提出的G2o通用图优化算法对非线性重投影误差函数进行优化,最小化Ps中每个点Pi在对应图像上的重投影误差,以此减少误差积累对三维重建结果的影响,获取最优的摄像机姿态集和稀疏三维点集。
算法步骤4的具体流程见图1。
图1 摄像机位置姿态和古建筑稀疏三维点云的计算流程
步骤4的子步骤(4)为了提高Bundle Adjustment优化算法的效率,采用了G2o图优化算法,对于每一个摄像机姿态和三维点,建立图中对应的节点,对每一个三维点与对其可见的摄像机姿态之间建立对应的边,利用G2o算法对以下目标函数进行优化:
(1)
式中:m和n分别为集合Q和集合Ps的元素个数;aj为第j幅图像的摄像机姿态,bi为第i个空间三维点;π表示第j幅图像的投影方程即π(aj,bi)=KTj(bi);xij表示第i个三维点在第j幅图像上的图像坐标。
步骤5根据摄像机的位置姿态T0,T1,…,Tn和稀疏三维点云,利用PMVS算法[19]计算获取古建筑的稠密三维点云Pd。步骤5主要包括3个子步骤:(1) 初始化特征匹配,即利用每幅图像的特征点生成稀疏面片的过程。对于图像Ii,以及其对应的光心O(Ii),其中的特征点f,通过允许有两个像素误差的极线约束找到它在其他图像中的同种类型的特征点f′,构成匹配点对(f,f′)。再用这些匹配点对使用三角化的方法生成一系列三维空间点,将这些点按照距离O(Ii)从小到大顺序排列,依次尝试生成面片,直到成功获得一系列的稀疏面片。(2) 面片生成和扩展,目标是在每个图像网格中至少重建一个面片,方法是从已有的面片出发,在其附近的空白空间搜索满足一定条件的邻域图像块集合,不断进行迭代,生成新的面片,直至面片重建完成。(3) 面片过滤,主要引入了两个过滤方法以滤除错误的面片。第一个过滤方法依赖于可见一致性;第二个方法是正则化操作,即对于每个面片p,首先获取在其所有可见图像I(p)中p所在或相邻的图像网格中所有的面片。如果获取的面片中p的邻域所占比例低于一定值(如25.0),则认为p为外点并将其滤除。通过步骤5可以生成分布较为均匀的古建筑稠密三维点云。
步骤6根据古建筑的稠密三维点云及其法向量,利用泊松表面重建算法[20]构建三角网格,通过对模型的指示函数进行逼近及提取等值面得到一个闭合的三角化近似表面,生成古建筑三角网格面片模型。
步骤7应用了Waechter等[21]的方法,利用摄像机姿态、三角网格和图像信息,应用一种轻微变形的均值平移算法来检查视图的一致性,通过视图剔除、遮挡物消除等操作优化视图的选择,合并面片冗余信息,以此减少纹理映射错误,从而恢复古建筑的三维纹理模型。
根据系统算法步骤将系统分成图2中的各模块来实现。系统中各模块和算法功能使用C++语言编程实现。模块1输入不同视角拍摄的古建筑图像序列,根据建筑场景规模大小和建筑复杂度,一般需要摄取采集几十幅到几百幅图像不等;模块2实现原始二维图像序列的特征点的检测和匹配,通过提取SIFT特征点,并建立描述子进行特征匹配,得到图像序列的初始公共种子匹配点,接着对种子匹配点进行匹配扩散,获得图像序列的准稠密匹配点。
图2 系统设计各模块
模块3根据模块2的图像特征匹配结果,计算摄像机的位置姿态即摄像机内参数矩阵,这里采用了文献[16]的标定方法来实现;同时,根据本系统算法的步骤4,计算得到古建筑的稀疏三维点云;之后,调用G2o图优化算法的开源框架对摄像机的位置姿态和稀疏三维点云进行优化,以此减少累计误差带来的重建错误。模块4利用PMVS多视角立体匹配算法实现古建筑稠密三维点云生成。模块5根据模块4的稠密点云结果,运用泊松表面重建算法构建三角网格,生成三角面片模型。模块6根据上一模块计算结果,进行纹理映射,实现生成带纹理的古建筑三维重建模型。
系统各模块之间的数据和接口调用使用Python语言编程实现。为了呈现直观且全视角观看的古建筑三维重建模型,本系统还设计了三维模型生成的运行界面,使用PyQT5来实现,程序运行界面设计如图3所示。
图3 古建筑三维重建系统设计界面
根据古建筑数字化需求和项目研究目标,对深圳市的三个具有代表性的古建筑进行了现场图像拍摄,分别为深圳赤湾中华神海、深圳南头古城牌楼和深圳赤湾天后宫。本节给出了利用本文设计的系统而实现的上述三个古建筑场景的三维重建结果。系统实验场景运行的PC平台配置如下:Windows 10操作系统,Intel(R) Core(TM) i7-7700HQ 2.80 GHz CPU,8 GB内存。图4是将拍摄的82幅不同角度的深圳赤湾中华神海古建筑图像(分辨率为5 472×3 648)运用本系统进行三维重建得到的结果,包括原始图像、三维重建点云、纹理映射的三维模型、三维重建面片模型。图5则是根据不同视角拍摄的162幅深圳南头古城牌楼的图像序列(分辨率为4 032×3 024)而重建的三维模型结果。图6是本系统输入287幅深圳赤湾天后宫古建筑图像序列(分辨率为5 472×3 648)进行三维重建的结果。
图4 深圳赤湾中华神海三维重建结果
图5 深圳南头古城牌楼三维重建结果
图6 深圳赤湾天后宫三维重建结果
表1给出了上述三组实验(深圳南头古城牌楼、深圳赤湾中华神海、深圳赤湾天后宫)的运行时间和三维重建模型运行的结果数据,包括图像匹配和稀疏点云重建时间、稠密点云重建时间、三维点数、面片数及顶点数等。
表1 三座不同古建筑的三维重建运算时间及重建数据
可以看出,实验运行时间主要消耗在稠密点云重建这一阶段。而系统前面阶段如图像匹配和稀疏点云重建,以及后面阶段如三角网格构建和三角面片模型生成,都只占运行总时间的一小部分。对于输入近百幅甚至是几百幅的图像序列,由于室外场景物体较多、建筑复杂度较高、原始输入图像数量多、图像分辨率高等特点,重建得到的三维点云数、顶点数以及面片数量都非常巨大,从而在普通硬件配置的PC机上要进行较长时间的运算,但这是可以理解和接受的。总体来看,三组古建筑场景实验的三维重建效果在视觉上和准确性上都是较良好的。
为了将本系统应用的G2o图优化算法运行时间与传统的SBA优化算法时间进行对比,实验还对深圳赤湾中华神海、深圳南头古城牌楼、深圳赤湾天后宫这三组古建筑场景三维重建的优化算法运行时间进行了对比,如图7所示。两个优化算法的PC平台配置都与以上实验相同。从图7可见,对于深圳赤湾中华神海、深圳南头古城牌楼、深圳赤湾天后宫三组场景,G2o优化算法比SBA优化算法的运算时间分别减少了29.5%、25.4%、26.8%。
图7 三组场景的G2o优化算法与SBA优化算法运行时间对比
可以看出,系统对于不规则且复杂的古建筑场景得到的三维重建效果都比较良好。在重建精度方面,由于古建筑场景中的某一个单独物体或其中某一部分的三维重建精度较高,但对于其他部分却比较低。因此,当前大量文献中报道的室外大场景特别是大型古建筑的重建方法均没有进行定量评价。本系统主要是面向古建筑的三维数字化应用需求,实验中未给出三维重建的精度定量评价,也未与其他三维重建方法在重建精度方面进行比较。一方面是由于三维重建的场景对象不同,所选取的都是不同的方法;另一方面是由于没有合适的古建筑的三维重建精度评价体系,所以很难进行定量比较。
通过单台摄像机对古建筑二维图像序列摄取、图像特征点检测和匹配、摄像机位置姿态计算、三维点云计算、纹理映射计算及优化算法等步骤实现了基于视觉的古建筑的三维重建系统。通过实验结果可以看出,本文系统能够获得视觉效果良好、较强真实感的古建筑三维结构模型。
本文系统设备成本低、操作简单而可靠、实施性较高,能广泛应用于室外复杂的古建筑场景,对于古建筑数字化保护的研究和技术开发人员具有一定的参考价值。未来工作旨在提高古建筑三维重建系统的运算效率和重建精度,以及从不规则的古建筑三维重建模型中恢复其规则的CAD模型。