基于二维仿射变换的几何一致性虚实融合
2022-06-30滕嘉玮张艾嘉王世刚王晓坤
滕嘉玮,赵 岩*,张艾嘉,王世刚,王晓坤
(1.吉林大学 通信工程学院,吉林 长春 130012;2.空军航空大学 航空作战勤务学院,吉林 长春 130022)
1 引 言
增强现实(Augmented Reality,AR)[1]一直是三维显示领域的研究热点,将计算机生成的虚拟对象与真实场景相结合,达到增强用户视觉感观的效果。AR广泛地应用于工业、军事、医疗等领域[2],近年来也经常出现在春节联欢晚会的节目中。AR技术在现代生活中扮演着越来越重要的角色,并且不断改变着我们的日常生活。该技术的核心是虚实融合技术[3],为了使虚实融合效果更加逼真,需要使虚拟对象与实际场景呈现一致的几何效果。几何一致性主要考虑的是场景中真实对象和虚拟对象的遮挡和几何匹配,增强观众在视觉上的真实感。
在AR领域中,解决几何一致性虚实融合的方法主要分为辅助标记法和辅助设备法[4]。Guo等[1]采用双通行方案,首先用平行相机实时跟踪,并允许在扫描过程将重建结果更新并且可视化,然后根据摄像机姿态处理虚拟对象和真实场景模型之间的遮挡,将渲染结果与彩色图像融合。Liang等[5]提出了一种为ARAS设计的裸手深度感知方法,它可以输出操作员的手部和虚拟零件之间的正确遮挡。该方法包含一个悬挂在立足点上的深度摄像机,由该摄像机提供了场景的俯视图,并提出了一种基于深度摄像机的手部分割方法。Güneş等[6]提出了一种无标记的3D AR应用程序,用于人体手臂周围的虚拟物体试穿。
上述这些方法都是在三维层面上处理模型和场景之间的遮挡和几何匹配。本文提出了几何一致性虚实融合算法,讨论了真实场景中的人体手臂是否正对摄像机拍摄的两种情况。在手臂二维图像上确定腕部的宽度和位置后,计算出虚拟腕表的位置、缩放和旋转角度,最终通过差分渲染得到虚实融合的结果。为了使结果更加真实同时也考虑了光照一致性[7]。实验证明在二维层面处理模型,可以更细致、精准地确定虚拟物体与真实场景的几何关系,使虚实融合结果更真实。
2 虚实融合系统的构成
本文提出的虚实融合系统框图如图1所示。首先对场景进行三维重建得到场景三维模型,对场景的三维模型进行分割,分割出手臂区域并计算手腕的位置与宽度。然后,通过差分渲染[8]算法把虚拟物体插入到真实场景中,最后为了虚实融合结果的真实性,对场景进行光照估计,构建了几何一致性和光照一致性统一的虚实融合系统。
图1 虚实融合系统框图Fig.1 System diagram of virtual-real fusion system
3 关键算法
3.1 场景模型重建算法
使用Kinect相机[9]拍摄场景得到场景的深度图像和彩色图像,采用KinectFusion[10]算法来重建三维场景。在导出重建的场景模型之后,通过蝴蝶细分算法[11]分割场景模型,将场景中的人体手臂部分分割出来。因为需要大量的点的坐标数据,所以将分割好的手臂模型表面的三角面片细分,增加其顶点数量,最后将所有的顶点坐标输出。
3.2 手腕位置与宽度计算
3.2.1 投影映射算法
当手臂正对摄像机时,手臂的三维模型坐标系中z轴垂直于视觉平面。此时将模型的所有x o y平面向z轴的方向投影,映射的结果就是手臂的二维图像,如图2所示。
图2 手臂二维图像Fig.2 Two-dimensional image of arm
从图2可以看出,手臂上的主方向是从手肘到手腕的方向,即水平方向。为了验证结果的准确性,计算了手臂二维图像协方差的特征值,发现手臂二维图像的水平特征值最大,因此得到的手臂二维图像是准确的。
不难发现手臂二维图像上因为一些点的缺失或者与其他点重叠,一些垂直列上的点很稀疏。在计算腕部位置与宽度时,这会导致错误。因此,删除所有稀疏点的垂直列,获得新的手臂二维图像如图3所示。
图3 优化后的手臂二维图像Fig.3 Optimized two-dimensional image of arm
在图3中,很容易找到手臂二维图像每列的上边缘和下边缘上的点。上边缘的点记为Yupper,下边缘的点记为Ydown。因为这些点是离散的,上下点不严格匹配。因此,计算每列的长度为:
其中:x=2,…,N-1;j=i-1,i,i+1,第i列的长度值是3条线的最大值。通过每一个下边缘点与其对应的3个上边缘点之间的长度来计算腕部的长度。在获得不同列的长度之后,最短的长度被视为手腕的长度,可通过以下公式得出:
其中:Loc是计算得出的腕部宽度,相应的x值可以确定哪根立柱是腕部位置。
3.2.2 仿射变换算法
手臂与摄像机成一定夹角,按照3.2.1的方法得到的手臂二维图像如图4所示。
图4 不正对摄像机的手臂二维图像Fig.4 Two dimensional image of arm not facing camera
由图4可以看出,手臂的二维图像不方便直接计算出手腕的位置与宽度,所以需要对手臂的二维图像进行仿射变换。
仿射变换[12]是在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射,由一个非奇异的线性变换[13](运用一次函数进行的变换)并接上一个平移变换组成。这里使用仿射变换(或2D仿射变换),主要包括旋转、平移和缩放等。该变换结果仍然保持二维图像的平坦度,即直线上的点仍然在直线上,点的位置顺序保持不变,二维图像的相对位置不变。
任何仿射变换都可以表示为矩阵与向量的乘积,然后通过齐次坐标将这两部分结合起来,矩阵平移公式为:
然后假设矩阵旋转角度为α角,则坐标的仿射矩阵为:
类似地,假设缩放因子为s,则坐标的仿射矩阵为:
因此,需要根据上述算法优化手臂的二维图像。求出图4中手臂二维图像上所有点的坐标,然后计算将其转到面向相机的手臂二维图像的旋转角度。经过计算可得旋转角度为π/3,旋转后手臂的二维图像如图5所示。
3.3 坐标系统一算法
因为真实场景中物体的坐标系和虚拟物体的坐标系存在差异,所以坐标系的统一有利于虚实融合。在手腕位置的中心点处建立了第一个坐标系,同时在虚拟腕表的表盘处建立了第二个坐标系,需要通过坐标系的旋转和平移将两个坐标系统一[14]。
图5 旋转后的手臂二维图像Fig.5 Two dimensional image of arm after rotating
矩阵旋转有3个,分别绕x轴旋转,绕y轴旋转,绕z轴旋转。其中,绕x轴旋转的旋转矩阵为:
其中θ为旋转角度。
同理,可以得到绕y轴旋转和绕z轴旋转的旋转矩阵:
如果有一个旋转可以表示为依次绕着3个旋转轴旋转3个角度的组合,那这3个角度可以称之为欧拉角,3个轴的旋转次序不同,得到的结果也会不同。例如,常用的AR软件Unity3D中欧拉角的旋转顺序就为Z Y X,所以旋转顺序很重要。
通过欧拉角旋转将两个坐标系统一。由欧拉角求旋转矩阵时,设3个轴的欧拉角分别为θx,θy,θz。正弦值和余弦值分别为sx,cx,sy,cy,sz,cz,那么旋转矩阵为:
解上述旋转矩阵可以逆向求得3个欧拉角,分别为:
其中rij是旋转矩阵中的元素值,i,j=1,2,3。由此就可以得到坐标系3个坐标轴各自的旋转角度。
3.4 差分渲染算法
为了自动地将虚拟物体与真实场景相融合,采用了差分渲染算法。
3.4.1 虚拟对象的插入
为了在获得的图像中插入虚拟对象,实现场景的几何一致性,在场景中放置一个虚拟对象,场景中的一些像素会被虚拟对象遮挡。虚拟对象也会影响未被遮挡的像素,当虚拟对象在场景中投射阴影时,插入对象周围的局部区域将变暗。Debevec等[18]将该区域称为“局部场景”,并使用微分方法渲染该区域。
在给定的场景光照和相机参数下,对有合成对象和无合成对象的虚拟局部场景进行渲染,得到图像IO和IN。这两个图像之间的差异揭示了插入的对象对场景的影响。该改变被添加到原始图像IF以生成合成图像IΔ:
差分渲染要求在虚拟局部场景中渲染虚拟对象,并将虚拟局部场景与真实场景调成一致的像素。然而,因为虚拟局部场景的像素强度可能在每一个图像之间发生变化。通过相机进行自动曝光校正,虚拟局部场景的颜色强度会发生变化。所以插入虚拟物体后,插入前后图像的像素强度会不一致。为了克服这个问题,计算得到:
其中SO和SN分别是具有和不具有虚拟对象的渲染无纹理场景。它们的比率显示插入虚拟对象导致的像素变暗程度。
如果原始场景中的某个区域被插入的对象遮挡,便将它替换为虚拟对象中的像素。通过在相机坐标系中比较场景像素和对象像素的深度来确定这些区域;如果插入的对象离摄像机较近,IO中的像素将复制到IC。
由于摄像机的运动,初始场景图像可能会模糊。为了产生更具说服力的结果,虚拟对象也应根据摄影机的移动进行模糊。当在时间t处合成图像IC时,收集多个样本,样本时间t=t-Δt其中Δt∈[0,]1,通过对样本时间t'处合成的图像进行平均来获得最终合成图像Ic,t:
式中IO,t',SO,t'和SN,t'的定义与式(10)和式(11)中的IO,SO和SN相同。在样本时间t'进行渲染并计算t'处的相机姿态。IF,t是输入图像。Mt'是一个值为1的二元掩膜,其中插入的对象在时间t'和其他位置为0的地方开始遮挡原始场景。这可以反映出虚拟对象随着场景的移动而移动,从而使整个场景更加连贯。
3.4.2 阴影检测
如果光源被其他对象阻挡,则投射的阴影可使其他阴影变形。如果能计算出有多少光线被遮挡,就能消除阴影。如果场景几何体和照明可用,通过式(13)确定每个点被遮挡的光线数量,即:
需要通过忽略可见性项V(V表示来自光源的光按照正常照射方向照向物体表面)来计算它在没有遮挡的情况下接收的光线数量。忽略可见性项V后,式(13)变为:
当S(x)和S'(x)分别测量到达x的光线是否有遮挡时,S(x)/S'(x)表示光线在x处无遮挡的程度。为了去除阴影,将每个像素I(x)除以S(x)/S'(x)的值以补偿阴影。然而,该值可能不准确,某些区域会被过度校正,而其他区域仍然太暗。为了克服这个问题,本文生成一个阈值为S(x)/S'(x)的阴影遮罩,并使用掩膜区域中的局部照明变化来调整其外观。
由于本方法中在插入对象和阴影检测的同时也考虑了场景中的光照影响,所以在场景中对虚拟物体进行了光照估计[15-19]。
4 实验结果
4.1 手腕位置与宽度确定
采用式(2)来确定手腕位置和宽度,通过计算手臂二维图像上每一列的上下边缘点的差值来计算每一列的长度,得到的结果如图6(a)所示,此时计算出的长度曲线图很不规则,很难处理。考虑到手臂二维图像上存在边缘点缺失的问题,将每一个下边缘点与它对应的上边缘点和其左右相邻的两个上边缘点连线,计算3条线的长度,得到的结果中取最长的一条线作为这列的长度,最终的长度曲线如图6(b)所示。
图6 确定手腕位置与宽度实验结果Fig.6 Experiment result for determining wrist position and width
由图6可以看出,手腕的位置在横坐标(表示列数)279处,宽度为对应的纵坐标66,用白线标记出来,如图7所示。
图7 白线标记手腕位置Fig.7 Wrist position marked by white line
4.2 虚实融合
通过3.3中坐标系统一的算法将坐标系旋转的3个欧拉角计算出来,再通过差分渲染算法,结合计算出的虚拟物体旋转角、位置坐标和缩放将对象插入到真实场景中并进行渲染[20],虚拟腕表模型以及插入虚拟物体后场景的初步融合图如图8所示。
图8 插入虚拟腕表模型融合Fig.8 Fusion image of virtual watch model on arm
为了使融合结果更加真实,采用基于全局照明模型的光照估计算法[17]对场景加入了光照估计,结果如图9所示。
将计算得到的手腕宽度与实际手腕宽度比较,将虚拟腕表旋转角度和位置点与实际的腕表旋转角度和位置点比较,然后进行误差分析,结果如图10和表1所示。把计算得到的手腕宽度与在手腕处4次测量得到的宽度相比较,可以看出计算得到的数据在误差范围内。
表1为计算得到的虚拟腕表的3个坐标轴的旋转角度和坐标原点的坐标与实际测量得到的结果,误差控制在4%左右。
为了验证结果,按照文献[7]的方法,使用计算机检测手腕姿态,在骨架提取之后确定了手腕点,通过四元数算法旋转虚拟物体,得到虚拟物体的旋转角度(x,y,z)为(-30°,163°,47.5°)。最后通过渲染RGB得到融合图,如图11所示。与图11的误差分析结果中虚拟物体的旋转角度相比,本文的计算精度提高了15%左右。
图9 虚实融合结果Fig.9 Result of virtual-real fusion
图10 手腕宽度计算误差分析Fig.10 Error analysis of wrist width calculation
图11 文献[7]的虚实融合结果Fig.11 Result of virtual real fusion in reference[7]
文献[7]中,通过Kinect深度相机的骨骼点提取,确定出手腕的骨骼点位置,经过实验发现,该方法只有人在深度相机视野内,并且要距深度相机特定的距离,所以具有局限性。在虚实融合部分文献[7]采用的是四元数算法,没有实际考虑到虚拟物体真实的体积,所以手表和手腕的融合几何一致性不够好。
表1 坐标系旋转角度和坐标原点位置比较Tab.1 Comparison of coordinate system rotation angle and coordinate origin location
5 结 论
本文提出了一种几何一致性的虚实融合方法,并结合光照一致性,实现了具有几何一致性和光照一致性的虚实融合系统。该系统使用Kinect重建场景三维模型,使用三维到二维的方法处理手臂,并采用一种基于空间的变换方法来提高精度。最后,使用差分渲染将虚拟对象准确地插入到真实场景中。实验结果表明,经过本文方法确定手腕的位置与宽度,其误差在实际测量的数据范围之内,得到的手表坐标系的旋转角度和位置与实际测量结果的误差在4%,且融合效果提升了15%左右。