一种基于分段三维重建的人体参数测量系统及方法与流程

文档序号:14450978阅读:171来源:国知局

本发明涉及一种对以人体为代表的物体分段三维重建及测量的方法,具体涉及一种基于分段重建的人体参数测量系统及方法,通过kinect对人体进行分段扫描,分若干线程完成图像配准和融合,推荐分为三段,然后拟合多段数据消除边界折痕,建立保留细节、无空洞的三维模型。并扩展了利用体元计算模型体积的功能,以及结合人体骨骼测量身高、臂长、围长等数据的功能。搭建了以深度传感器和笔记本电脑交互界面组成的系统。



背景技术:

在计算机视觉和计算机图形学中,三维重构技术是通过二维图像来获取三维空间中真实物体的形状和外观的过程,这个过程可以通过主动或者被动的方法来完成。

kinect系列相机通过主动对物体发射结构光再接受反射可以获得物体的深度图像,本发明使用的是kinectv2相机。相机还能够直接返回包括人体骨骼在内的数据,已经被应用在包括虚拟试衣,三维重建,机器人视觉等众多方面。

kinectfusion算法的主要工作是根据深度相机采集到的截断有向距离函数(tsdf),通过迭代最近点(icp)的办法完成三维模型和多帧数据之间的配准,在静态场景中能够获得比较高的重建效果。然而传统基于kinectfusion算法的重建设备主要针对静态场景的三维重构,理论上只能允许物体在场景中平稳、匀速旋转而不丢失跟踪,满足重建要求。但是在特定的应用场景下,例如对人体进行重建,人在相机前旋转的过程中很难不丢失跟踪,获得的物体模型质量比较差。此外,算法中相机位姿的估计对于场景中物体的几何特征比较依赖,相机跟踪难度也会增加。



技术实现要素:

本发明的目的在于针对已有技术存在的不足,提出一种基于分段三维重建的人体参数测量系统及方法。该系统能够不丢失跟踪,获得完整的人体三维模型,并测量人体身高、臂长、围长、体积等数据。在被测者自主旋转情况下,由于腿部和头部为非刚体运动,测量的是人体躯干部分的数据。配合转台,可进行全身的测量。整体框架见图1。

为达到上述目的,本发明的构思是:

1.深度图像采集,测试对象在kinectv2相机前原地旋转360°,由相机扫描并采集深度图像和人体骨骼数据,建立合适的工作空间。

2.分段重建三维模型,采用kinectfusion算法将采集到的图像数据拆分为n个线程并行进行基于体素数据的三维模型重建,推荐为3个线程。

3.融合多视角下的数据。由于每个部分的最后一个视点估计是不值得信赖的,所以在模型上会产生粗糙的折叠曲面,需要处理消除模型的边界折痕。

4、根据kinect获得的人体骨骼数据,计算人体的身高、臂长、肩宽等参数。

5、根据骨骼数据,截取胸部、腰部、臀部相应高度的二维tsdf图,筛选轮廓点,计算围长。遍历场景中的体元,根据每个体元中八个体素的tsdf值计算该体元中物体所占的体积,累加获得所有的体元中物体所占的体积,即三维模型的体积。

一种分段三维重建和人体测量的系统,根据上述发明构思,本发明采用下述技术方案:包括笔记本电脑、深度传感器kinectv2、水平转台(可选),结构如图2所示。在笔记本电脑上搭建了如图11的用户交互界面,右下角有两个按钮。点击“capture”按钮,用户根据提示在kinectv2相机前原地旋转360°,在20秒内获得被测者的300幅深度图像。kinectv2通过数据传输线连接到笔记本电脑中。单击交互界面“calculate”按钮,笔记本电脑进行基于kinectfusion的算法进行三个线程并行的三维重建,然后依赖相机捕捉到的人体骨骼信息,测量身高、臂长、肩宽等身体数据。同时根据体素网格,统计出有效的实体元体积和边界体元中属于物体的体积,以测量模型的体积,即人体体积。一种分段三维重建和测量人体体积的办法,采用上述的测量系统进行操作,其特征和具体操作步骤如下:

根据上述发明构思,本发明采用下述技术方案:

一种基于分段三维重建的测量人体数据系统和方法,包括水平电动转台(1)、深度传感器(2)和笔记本电脑(3),其特征在于:所述深度传感器(2)安置在水平电动转台(1)附近,使其能对竖立于水平电动台(1)上的待测人体(4)进行扫描,而其输出连接至电脑(3)。根据深度传感器(2)获得的人体骨骼数据测量身高、臂长,确定周长测量的切割高度,计算人体周长,根据体素网格,统计出有效的实体元和边界体元中属于物体的体积,以测量模型的体积,即人体体积。

所述深度传感器(2)采用相机kinectv2,所述电脑(3)采用笔记本电脑。

一种基于分段三维重建的测量人体数据系统和方法,采用上述的系统进行操作,其特征在于操作步骤如下:

①深度图像采集:将kinect相机和笔记本电脑连接好,被测者站在距离相机1.2~1.5米左右处,保证相机可以完整拍摄到需要重建的部分。进入捕捉过程,根据界面提示,在20秒的时间内匀速、平稳旋转一周。在此期间,kinectv2匀速对被测人体进行拍摄,每秒采集15帧深度图像及彩色图像,共采集300幅图像分辨率为512×424的深度图像,同时相机可以获取人体的骨骼数据,通过数据传输线连接到笔记本电脑中。

②分段重建三维模型:获取的人体图像数据传输到笔记本电脑后,在笔记本电脑中采用kinectfusion算法对每一线程独立进行frame-to-model的三维重建。该算法主要包括四部分:双边滤波、迭代最近点(icp)、截断有向距离函数(tsdf)、场景渲染(ray-cast)。分段模型将在后续步骤中融合。

③模型可视化:重建的3d模型是3d点云的形式,工作空间内的每一个点包含了rgb值和深度信息,视觉上不够直观。为了使最终的三维数据能够形象地展示在用户眼前,本设计中加入了曲面拟合步骤,采用的是移动立方体(marchingcubes)算法。主要是根据体元中各体素的虚实情况寻找近似的小三角形拟合物体分界面,得到直观、形象的3d模型。

④消除折痕:每个线程都可以得到一个3d模型,故可以获得如图6的三个不同角度的模型,需要拟合为一个完整的模型。由于每个模型最后的单个视点可靠性很差,拟合后的模型拼接处存在粗糙折痕,如图9。本设计通过优化前一阶段的最后一个视点的位姿(同时是后一个阶段的参考视点)来消除模型的折痕现象。算法中我们从该视点出发利用光线追踪算法(ray-tracing)向场景中投射光线,根据两个阶段融合的sdf模型分别拟合出两幅点云。然后,通过迭代最近点算法(icp)配准两幅点云,从而非线性优化该视点的位姿,获得无折痕的最终模型,如图8。

⑤数据测量与计算:身高、臂长等数据通过kinect相机获得的骨骼数据可测。围长和体积数据通过建立的三维模型体素获得。围长是对应高度处轮廓点的欧式距离之和。体积的计算是遍历所有的体元,在遍历过程中累加模型内部体元的体积和在模型表面体元中属于模型部分的体积,得到模型的总体积,即可得到被测人体的体积。

所述步骤(1)中采集的人体骨骼数据用于建立合适的工作空间。工作空间是由许多未切割的体素网格组成的长方体,理想的工作空间应包裹待重建的部分,并保留适当的冗余。本设计的设置如下:假设人体在第一帧时正面面对kinect相机,设置x方向为两侧肩膀的走向,工作空间为左肩膀左侧10cm处至右肩膀右侧10cm处;y方向为人体直立的方向,躯干测量中,工作空间取脖子到腿部的部分,不设置冗余量;z方向为相机光轴方向,根据关于人体的先验知识,设置为50cm。

所述步骤(2)中使用kinectfusion算法框架进行三维重建,先使用opennisdk2自动对齐深度相机与彩色相机的坐标系,并以深度摄像机的坐标系为全局坐标系来建立体素网格。以被测者面对镜头的图像作为第1帧图像,后续依次标记,共300帧图像。

因为在后续要做的kinectfusion算法中,人体360°的旋转很容易导致跟踪失败,直接造成三维重构失败。要在120°以上的旋转下保持跟踪的条件也十分严格,实用性差。同时,300张图像一起进行处理,在时间上的开销非常大。所以需要分线程并行,以分三个线程为例,将整个三维空间每120°分为一个部分,各部分独立跟踪。实际操作中,1-100帧、100-200帧、200-300帧分别作为一个独立的线程,以各自的首帧的相机坐标系为该阶段的参考坐标系。

所述步骤(2)中使用kinectfusion算法框架进行三维重建,该算法是基于体素网格数据的重建,主要包括四部分:双边滤波、迭代最近点(icp)、截断有向距离函数(tsdf)、光线投射(ray-cast),工作流程如图4所示。为了将各个视点下获取的深度数据融合在一起,利用迭代最近点方法配准当前深度帧与全局模型(frame-model),用于实时估计相机的位姿,计算出从本地到全局转移矩阵,并结合有向距离函数在三维体素网格上融合各个视点下的三维数据,更新全局模型。此外,用双边滤波将kinect相机获得的原始数据去噪,为icp步骤中的寻找最近点奠定基础;用光线投射获取当前视点下观察到的模型点云,与下一帧的深度帧进行新一轮的配准,图6为从三个角度下观察到的三维重建模型结果。

所述步骤(3)采用的是marchingcubes算法,体元是由8个体素组成的正方形网格,全部体素在目标物体内部的为实体元,全部在目标物体外部的为虚体元。为了还原得到可视化的模型外观,我们关注的是被物体表面分割的边界体元。marchingcubes算法就是用三角形片去拟合分界面。每个体元根据8个体素的虚实之分共有256种可能的情况,可以建立一张256行的索引表来确定每种配置下的三角形片。

可视化过程中,每个体元配置为一个8bit序列,查询索引表,若存在对应的三角形,说明该体元为边界体元,根据表找到三角形片的三个顶点。多个三角形片组合在一起,就得到了该部分的三维模型。

所述步骤(4)中用光线追踪(ray-tracing)算法实现每个线程之间的曲面拟合。因为在每个线程的最后一帧处,单独帧的视点是不可靠的,所以直接融合两个部分的有向距离函数会造成粗糙的折痕。为了优化这个问题,在寻找两幅点云的对应点时,除了比较3d点之间的欧氏距离,还引入表征模型集合特征的曲率信息,一同组成四维向量(x,y,z,λ)作为约束。假设在第n个线程(如图12)的最后一个视点处存在一束光线,向由该线程独立重建的三维模型投射,可获得当前视点下深度图像上的tsdf值。再由该视点向第n+1个线程重建的三维模型投射,获得相同视点下的另一组tsdf值。模型配准就是要优化交界视点处的相机位姿,使得两次投射获得的图像依据特征残差最小的原则进行配准。

通过上述技术方案,在分段重建人体三维模型过程中解决了连接处的折痕问题,优化了最终模型的质量,保证了维度测量和体积测量的可靠性。

所述步骤(5)中涉及了对人体身高、臂长、围度、体积的测量。kinectv2相机可以获得人体骨骼数据,测量人体的身高、臂长、肩宽。

围长包括胸围、腰围、臀围。在对应处的高度的体素网格中以体元为单位筛选轮廓点。模型的截断位置由骨骼数据决定,相应高度截面的二维tsdf如图13,过零点即为可能的轮廓。

在遍历有效轮廓点过程中,将起点赋给当前像素点,在该点的八邻域范围内寻找候选点,若找不到这样的候选点,则扩大邻域范围直至寻找到候选点。找到候选点之后计算当前点与候选点之间的欧式距离,然后将候选点赋给当前点。重复上述过程,将当前点与候选点之间的距离累加起来,循环到遍历的最后点时结束,累加的距离之和即为围长。

采用上述技术方案,能够更加有效的找到人体轮廓,获得更可靠的人体围长数据。

本设计包含了结合三维重构算法计算人体体积的方法,主要思想是遍历每一个体元的tsdf值,根据体元的8个体素值可以将体元分为全部在物体外的虚体元、全部在物体内的实体元和部分在物体内的边界体元。具体办法为,根据体素编号,将一个体元中的8个体素按照顺序用一个字节来表示,tsdf数值大于0对应比特位为1,反之为0.将得到的二进制编码转为十进制,若为255说明是实体元,体积增加一个单位(1ml),若为0说明是虚体元,不计算体积。对于数值在0~255之间的体元,根据8个体素的tsdf的平均值近似计算物体所占的体积。近似值取volume=0.5*average+0.5。累加全部有效体积值即可获得整个三维模型的体积。

此外,本发明还拥有十分友好的人机交互界面,具体体现在以下三个方面:(1)动态显示功能。打开界面之后,界面(如图11)上的“彩色图相框”和“深度图像框”会动态地显示kinect采集到的场景彩色图像和深度图像。在程序运行过程中,界面上的“臂长”、“高度”、“肩宽”等参数框会显示相应测量到的参数。(2)语音提示功能。点击界面(如图11)右下角的“capture”按钮,按钮颜色变为黄色,并语音提示重建人员根据深度图相框显示的动态深度图,站立在距相机合适距离的位置,并提示重建人员进行自旋转操作,以便kinect相机扫描。(3)模型查看功能。在采集完300帧深度图像,点击界面(如图11)右下角的“calculate”按钮经过程序处理之后,可以显示重建之后,从人体颈部到臀部的三维人体模型,人体重建的部分有高亮,鼠标悬浮于模型时,可以看到相应的深度值。(4)文件保存功能。点击界面(如图11)左上角的“saveload”按钮,可以将重建模型以stl或ply的三维文件格式保存,亦可将用户名、参数保存到文档。

本发明与现有技术相比较,具有如下显而易见的突出实质性特点和显著技术进步:

1.本系统使用kinectv2对人体进行数据采集并采用kinectfusion算法进行三维重建得到带有有向距离函数的体素网格;再根据相机获得的人体骨骼数据和三维重建的结果获得人体身高、臂长、围长、体积等数据。该系统操作简便,计算结果较精确。提高了人体测量的便捷性,降低了人工成本,提高了测量的准确性,降低了测量误差。

2.多线程处理深度图像数据,分段建模。通过将整体模型分为若干个线程的方法解决了传统三维重建中容易丢失跟踪的问题,大大提高了系统三维重建的成功率。采用并行处理的方式,将处理时间缩短近一半。同时解决了多段模型连接时的折痕问题,得到完整、可靠、无空洞的人体模型。

附图说明

图1是本发明的算法框架示意图。

图2是本发明的测量系统结构框图。

图3是本发明的算法结构框图。

图4是kinectfusion算法程序框图。

图5是模型分割示意图,(a)为三维示意图,(b)为俯视图。

图6是分段的人体三维重建模型图。

图7是存在折痕的人体三维重建模型图。

图8是消除折痕后的人体三维模型图。

图9是从不同视角观察三维重建模型图。

图10是体元结构示意图,(a)为虚体元,(b)为边界体元,(c)为实体元。

图11是人机交互界面。

图12是边界视点示意图。

图13是二维tsdf示意图。

图14是人体轮廓示意图。

图15是本设计估计的相机轨迹(a)和kinectfusion算法估计的相机轨迹(b)。

图16是本设计提出的体积测量方法与散射随机点法比较的实验结果图。

图17是盒子放置及建模结果图。

图18是参数测量精度评估时的实验环境图。

图19是不同距离参数测量结果表。

图20是参数测量精确度评估表。

图21是不同距离人体和盒子的参数测量结果表。

具体实施方式

本发明的优选实施例结合附图详述如下:

实施例一:

参见图(2),本基于分段三维重建的测量人体数据系统,包括水平电动转台(1)、深度传感器(2)和笔记本电脑(3)。其特征在于:所述深度传感器(2)安置在水平电动转台(1)附近,使其能对竖立于水平电动台(1)上的待测人体(4)进行扫描,而其输出连接至电脑(3)。根据深度传感器(2)获得的人体骨骼数据测量身高、臂长,确定周长测量的切割高度,计算人体周长,根据体素网格,统计出有效的实体元和边界体元中属于物体的体积,以测量模型的体积,即人体体积。

实施例二:

所述深度传感器(2)采用相机kinectv2,所述电脑(3)采用笔记本电脑。

实施例三:

参见图3,本基于分段三维重建的测量人体数据系统,采用上述系统进行操作,其特征在于具体操作步骤如下:

①深度图像采集:用kinectv2对待测人体(4)进行360°扫描,采集其深度图像和骨骼数据,分若干线程处理;

②分段重建三维模型:通过kinectfusion算法对每一线程独立进行frame-to-model的三维重建;

③模型可视化:采用的是移动立方体marchingcubes算法进行曲面拟合,获得形象直观的三维模型;

④消除折痕:优化前一阶段的最后一个视点的位姿——同时是后一个阶段的参考视点,消除三维模型的折痕现象;

⑤数据测量与计算:通过相机kinectv2获得的骨骼数据测量身高和臂长;在胸部、腰部、臀部相应高度的体素网格中以体元为单位筛选轮廓点,计算围长;遍历体元,累加全部有效体积値,计算获得模型体积,即人体体积。

实施例四:

参见图2、图3,本基于分段三维重建的人体测量系统,包括水平电动转台(1)(可选)、深度传感器kinectv2(2)、笔记本电脑(3),其特征在于:所述待测人体按照笔直站立的方式自动旋转一周,或借助电动转台(1)匀速旋转一周,在距水平电动转台1.2-1.8m处的支撑物上放置深度传感器kinectv2(2)对人体(4)进行360°扫描,获取人体的深度图像、彩色图像及骨骼数据,kinectv2(2)的输出连接到笔记本电脑(3),在笔记本电脑(3)中采用本文提出的基于kinectfusion框架的分段跟踪和构图算法进行基于体素数据的三维重建,然后根据kinectv2(2)获得的人体骨骼数据,计算人体身高、臂长、肩宽等参数。之后遍历整个工作空间中的所有体元,根据体素网格的数据类型,找出位于重建人体模型内部的实体元及位于人体模型和外界的边界体元,在遍历过程中分别累加实体元和边界体元个数。对于实体元,将其转化为重建人体模型内部体积,对于边界体元,还需计算其八个体素顶点的tsdf的平均值,然后将其转化为边界体积,求和内部体积和边界体积,便得到人体的总体积。根据骨骼数据,截取胸部、腰部、臀部相应高度的二维tsdf图,依据体素网格的数据类型,将边界点记录为1,物体内部或外部点记录为0,利用hilditch算法将轮廓细化为一个像素宽度,在细化之后的二维图像上根据有效轮廓点进行遍历,在遍历过程中累加相邻体素之间的欧式距离来计算周长,将周长的计算转化为两体素之间沿人体轮廓的距离的计算。

实施例五:

本基于分段三维重建和人体测量方法,采用上述系统进行操作,其具体操作步骤如下:

①深度图像采集:点击界面(如图11)右下方的“caputer”按钮,根据界面右上方“深度图像框”显示的用颜色表示的人体和场景深度信息,待测人员在场景中前后移动至合适距离,直至人体深度信息显示为绿色,场景深度信息显示为红色,之后用kinectv2(2)在20秒内对人体(4)进行360°扫描,采集人体骨骼数据和300张深度图像,根据获取的人体骨骼数据建立大小合适的工作空间;

②重建三维模型:采集完300帧深度图像后,点击界面(如图11)右下方的“calculate”按钮,通过基于kinectfusion框架的分段跟踪和构图算法将采集到的深度图像融合成一个完整的具有体素网格形式三维模型,在界面右上方将显示重建人体从颈部至臀部的三维立体模型;

③二维参数计算:根据kinectv2(2)获得的人体骨骼数据,计算人体身高、臂长、肩宽等参数,这些参数在人体扫描过程中将在界面上对应的参数框内显示;

④体积计算:遍历整个工作空间中的所有体元,根据体素网格的数据类型,找出位于重建人体模型内部的实体元及位于人体模型和外界的边界体元,在遍历过程中分别累加实体元和边界体元个数,分别计算模型内部体积和边界体积,内部体积和边界体积求和,得到人体总体积;点击“calculate”按钮,体积将显示在对应的体积参数框内;

⑤网格体素切割:针对人体的自身结构,根据获得的骨骼数据,截取胸部、腰部、臀部相应高度的二维tsdf图;

⑥周长计算:在得到的二维截面上提取表示周长的有效轮廓点,遍历这些有效点,根据有效轮廓点,将周长的计算转化为两体素之间沿人体轮廓的距离的计算。

实施例六:

本实施例与实施例四基本相同,特别之处如下:

1.所述的分段三维重建和人体测量系统及方法,步骤(2)中使用基于kinectfusion框架的分段跟踪和构图算法进行三维重建得到带有有向距离函数的体素网格;

2.所述的分段三维重建和人体测量系统及方法,步骤(2)中使用基于kinectfusion框架的分段跟踪和构图算法前,先根据kinect检测的人体骨骼数据,创建大小合适的工作空间,并以深度摄像机采集第一帧图像时,深度相机坐标系为全局坐标系来建立全局体素网格。

3.所述的分段三维重建和人体测量系统及方法,步骤(2)中使用基于kinectfusion框架的分段跟踪和构图算法前,先将整个工作区域分为三个部分进行并行处理,如图5(a),即第一部分旋转角度约为0~120°,第二部分旋转角度约为120°~240°,第三部分旋转角度约为240°~360°,各部分以各自的第一帧图像为基准处理约100幅图像,并分别进行相机跟踪及重建模型,得到三个视角下的重建模型图如图6所示。

4.所述的分段三维重建和人体测量系统及方法,整个工作区域分为三个部分进行并行处理的方法,是因为传统的kinectfusion算法只针对于静态场景中的三维重构,若物体在场景中旋转360°,则算法很可能跟踪失败,导致三维重构失败。另一方面,由于kinectfusion算法对相机位姿是连续跟踪,引入轨迹漂移误差较大,导致深度数据融合存在较大偏差。将相机跟踪分为三个阶段,有助于减少相机位姿跟踪误差,获得较为精确、完整的人体三维模型,同时可以节省约一半的计算时间。

5.所述的分段三维重建和人体测量系统及方法,步骤(2)中使用基于kinectfusion框架的分段跟踪和构图算法时,在得到三部分各自局部坐标系的tsdf后,根据各自局部坐标系之间的变换关系,将三部分的tsdf融合为一个整体的tsdf,融合之后的模型如图9所示。构建model-model目标函数,实现对相机轨迹的优化,有助于抑制各阶段模型融合时缝合处的折痕,优化轨迹之后的模型如图8所示。

6.所述的分段三维重建和人体测量系统及方法,步骤(5)根据获得的骨骼数据,将建立好的人体三维重建模型进行切割成包含待测周长信息的二维截面,由于笔直站立的人体待测周长的各部分并不严格平行于坐标面,但又要结合计算复杂度不能太大便于后续计算的特点,这里选择的是平行于xoz面且经过实际待测周长面的平面作为切割面,保证了对人体体素网格进行有效切割,得到含待测周长信息的二维截面。

7.所述的分段三维重建和人体测量系统及方法,步骤(6)中,在采集计算过程中,网格分辨率有限,体素上的tsdf值很难恰好为0,单个点的tsdf可能产生误差,为了防止漏选轮廓点,所以这里采用以体元为单位筛选轮廓点的方式,同时利用hilditch算法将轮廓细化为一个像素宽度,在当前像素的八邻域内查找下一目标像素,若未查找到,则扩大像素查找范围,直至出现相邻的下一像素。这样做可提高提取有效轮廓点的准确性,从而提高系统整体的测量精度。

实施例七:

参见图2,图3,本基于分段三维重建和人体测量系统,该系统包括水平电动转台(孜敏电动转盘na350,转速约为20秒/圈)(1)(可选)、深度传感器kinectv2(2)、笔记本电脑(3),待测人体站在距深度相机合适距离处,在20秒内自旋转一周,或站立在匀速转动的水平电动转台上,水平转台的转速为0.314rad/s,水平转台带动站立在其上的人体一起匀速转动,在距转台1.2-1.8m处的支撑物上放置kinectv2,kinectv2匀速对人体进行360°扫描,其每秒采集15帧深度图像,20秒内共采集300幅图像分辨率为512×424的深度图像,通过数据传输线连接到笔记本电脑中。

如图3所示,本方法的整体流程为,首先kinectv2对人体进行360°扫描,采集人体骨骼数据及300幅图像分辨率为512×424的深度图像;获取的这些数据通过传输线连接到笔记本电脑后,在笔记本电脑中采用基于kinectfusion框架的分段跟踪和构图算法进行基于体素数据的三维重建。重建过程为先根据kinect检测的人体骨骼数据,创建大小合适的工作空间,以深度摄像机采集第一帧图像时,深度相机坐标系为全局坐标系来建立全局体素网格,经过人体扫描过程及建模算法处理之后,得到带有有向距离函数的体素网格,利用mc算法将体素网格可视化,可得到重建的三维模型;根据kinect检测的人体骨骼数据,计算身高、臂长、肩宽等参数信息;遍历工作空间,寻找位于人体内部的实体元和位于人体与外部边界的边界体元,将体元的计算转化为人体体积的计算;再对体素网格进行适当切割,得到包含待测周长的二维截面,之后在截面上提取有效轮廓点并对其进行欧式距离的累加,从而得到最终的待测周长。

本发明所述的三维重建算法是基于richarda.newcombe等人提出的kinectfusion算法框架改进而来。该算法是基于体素网格数据的重建,主要包括四部分:双边滤波、迭代最近点(icp)、截断有向距离函数(tsdf)、光线投射(ray-cast),工作流程如图4所示。为了将各个视点下获取的深度数据融合在一起,利用了迭代最近点方法(icp)配准当前深度帧与全局模型(frame-model),用于实时估计相机的位姿,计算出从本地到全局转移矩阵,并结合有向距离函数在三维体素网格上融合各个视点下的三维数据,更新全局模型。此外,用双边滤波将kinect获得的原始数据去噪,为icp步骤中的寻找最近点奠定基础;用光线投射获取当前视点下观察到的模型点云,与下一帧的深度帧进行新一轮的配准。其中tsdf是用一个数值来表示该点到最近的物体表面的远近程度,物体内部和外部的点用数值的正负来表征(图13)。如果物体表面以内的点的有向距离函数值是正值,那么物体表面以外的点的有向距离函数值就是负值,因此,有向距离函数值为0的点(过零点)即为物体表面上的点。

具体重建过程为:将kinectv2获取的300幅深度图像读入,分为三个阶段分别进行处理。第一阶段处理1~101帧,第二阶段处理101~201帧,第三阶段处理201~300帧。分别以每一阶段的初始深度帧为局部坐标系,利用kinectfusion算法生成各自局部坐标系下的tsdf,其中以第一帧为全局坐标系,建立体素网格。在每一阶段处理中,对于每一阶段的每帧新进入的深度数据,首先在深度图上进行双边滤波。遍历深度图像上的所有具有有效深度的像素,访问该像素的邻域像素,做加权平均,结果代替原有的中心像素。所谓双边滤波,就是求平均时权重由两个变量决定,一个是邻域像素在位置上到中心像素的欧式距离,一个是邻域像素和中心像素的深度值之间的差值,这两个值越大,权重越小。这样在做图像平滑的时候,可以有效保留物体的边缘信息。除了每一阶段的第一帧图像,其余的经过滤波的图像都和保存在全局体素网格中的数据做帧与模型(frame-to-model)之间的icp配准。模型中的点云通过光线投影法进行渲染得到,具体是从上一帧的视点下,从图像平面分别投射光线到全局体素网格,当遇到tsdf的过零点才停止,返回顶点图和法线图。然后与当前帧的顶点图和法线图按照欧氏距离寻找最近点,即配准时的对应点。由于处理的是连续帧的数据,相邻视点的位姿旋转可以用小角度的线性模型表示,然后用最小二乘法求解位姿变化量使对应点之间的点到平面距离最小。得到最小二乘解(位姿变化量)后,更新位姿,按照上面的方法重新寻找最近点,重复最小二乘求解,直至收敛。完成icp配准后,利用估计得到的位姿,将当前深度帧的点云数据加权平均到tsdf数据中,更新得到新的模型。每一帧都按照这样的操作,估计位姿和更新模型。模型与帧之间的配准,因为模型是经过多个深度数据加权平均得到的结果,要比单帧的数据更可靠,而且可以克服轻微的位姿估计的漂移,能有效减少累积误差。经过这个密集同时定位并制图过程(denseslam),我们最终得到人体重建的三部分各自的三维模型,如图6。之后利用三个阶段起始帧之间的位姿关系,将第二、第三阶段的局部模型转换到全局坐标系中与第一阶段的模型进行配准。由于每个阶段相机位姿跟踪存在累计误差,所以导致融合之后的全局模型存在折痕,如图9,需要自定义model-model目标函数,对相机位姿进行优化,以减少折痕,优化之后的全局模型如图8。图9为从三个角度下观察到的三维重建模型示意图。

在得到人体三维模型之后,要准确计算人体的体积参数,需要遍历整个工作空间中的所有体元,一个体元由八个相邻的体素组成,所有体元可分为三类:虚体元、边界体元和实体元,如图(10)所示。虚体元、实体元分别位于自由空间和人体模型内部,而边界体元位于人体与外界的边界。根据三种体元的数据类型,找出位于重建人体模型内部的实体元及位于人体模型和外界的边界体元,在遍历过程中分别累加实体元和边界体元个数。对于边界体元,还需估计其位于人体模型内部体积的占用百分比,求和实体元代表的模型内部体积和边界体元代表的模型边界体积,得到人体总体积。体积计算公式如下:

volume=v*(nums+λ*numb),λ∈(0,1)(1)

λ=0.5+0.5*argv(2)

其中v为一个体元的实际体积,nums为实体元的总个数,numb为边界体元的总个数,cube[i]为一个体元第i个顶点的tsdf值。

要准确地计算人体某一部分的待测周长,需要找到正确的切割面来切割出包含待测周长的二维截面,由于笔直站立的人体待测周长的各部分并不严格平行于坐标面,只是近似地平行坐标面,考虑到计算复杂度不能太大便于后续计算的特点,这里选择的是平行于xoz面且经过实际待测量周长面的平面作为切割面的切割方式,保证了对人体体素网格进行有效切割,得到含待测周长信息的二维截面。

体素切割之后,我们得到的是一幅整齐排列的二维图像数据,相比离散的点云数据,无需复杂的曲线方程拟合,只需要简单地二值化。得到二维截面之后,需要在截面中找出表示轮廓的点,如图14所示,并将这些点连接起来计算其中的周长。具体过程为:首先将截面点二值化,kinectfusion中是采用tsdf模型进行深度数据的融合,设某点x的tsdf值为f(x),若f(x)大于或小于0,说明点x属于被重建物体内部或者背景部分;若f(x)的值为0,说明点x是物体轮廓点。如图13所示,过零点的连线表示物体的轮廓。

因为计算过程中,网格分辨率有限,体素上的tsdf值很难恰好为0。所以为了防止漏选轮廓点,这里采用以体元为单位筛选轮廓点的方式。体元是三维网格中由相邻的八个体素点组成的小立方体,属于物体内部的体素点被称为实点,反之落在物体外部的被称为虚点;大多数的体元的8个体素都是虚点或者都是实点,这些体元被称作虚体元和实体元,如图10(a)和图10(c)所示,而我们感兴趣的体元是既含有实点和虚点,它们被称为边界体元,如图10(b)所示。

不妨设某个体元为xj,它是一个包含8个体素的集合:

xj={x0,x1,…,x7}(4)

边界体元集合c理论上可以表示为:

c={xj|0<g(xj)<8}(5)

其中表示二值化操作:

f(xi)代表一个体元的某个体素的截断有向距离函数。设感兴趣区域为i,则感兴趣的边界体元为:

从而得到感兴趣体素边界集合v为:

切割之后得到的体素截面如图14左图所示。边界点记录为1,物体内部或外部的点记录为0。

为了精确地计算待测周长,需要利用hilditch算法将原始轮廓细化为一个像素宽度,得到细化之后的体素截面如图14右图所示。但是该图中边界体素之间存在间隙,为了在得到当前体素的情况下查找下一体素,可在当前体素的8邻域内查找,如若未能查找到,则扩大邻域范围,继续查找。

在上述遍历边界体素过程中累加相邻体素之间的欧式距离来计算周长

其中p(vi)是寻找到的候选点,p(vi-1)是当前像素点,||p(vi)-p(vi-1)||2代表该两点之间的欧式距离,累加的距离和l即是待测周长。

该系统测量精度的评价采用相对误差标准,该系统的测量精度记为q1:

q1=(a-b)/b*100%(11)

其中a表示该系统测量出的人体体积及周长等参数值,b表示实际人体体积及周长等参数值。

若使用散布随机点方法进行测量,其测量精度记为q2:

q2=(c-b)/b*100%(12)

其中c表示散布随机点方法进行测量的人体参数。比较q1和q2大小即用相对误差标准来评价测量方法的精度。

实验结果

试验中,本设计所提出的算法用c#实现,具有友好的可视化界面,方便人机交互。本设计用于重建3d人体模型并测量人体距深度传感器不同距离时的人体参数。因此,在试验讨论阶段,将主要对3d重建结果、人体参数测量及参数测量精度三个部分分别讨论。

实验例一:三维模型重建

为了更加稳定地跟踪深度传感器,本设计将时域分为三个阶段,每个阶段分别用kinectfusion框架处理,并通过反复实验验证深度传感器的跟踪结果。图15展示了用分段跟踪策略跟踪相机位姿轨迹的结果,由于人体的自转是非匀速非刚体运动,因此估计的摄像机轨迹会出现抖动。如图15(a)所示,通过坐标变换将三个阶段估计的轨迹融合为一个全局相机轨迹,图15(b)展示了当使用kinectfusion算法时,由于存在大量的累积误差,位姿估计通常会失败。同样,图8显示了在人体自由旋转时,用kinectfusion算法无法重建完整的人体三维模型,相比之下,用本设计提出的相机分段跟踪策略,可以可靠地重建人体完整模型,重建结果如图9所示。由此可见,本设计提出的分段跟踪策略是减少位姿估计过程中的累计误差的有效方法,相比于kinectfusion算法,更加有利于重建完整的人体模型。

此外,本设计还对相机轨迹跟踪的结果进行了优化,以减少模型融合时产生的折痕,图8和图9分别展示了轨迹优化前后的重建结果。

实验例二:人体参数测量

本设计提出了一种新的测量人体体积和人体重要参数的方法。为了评估所提出方法的稳定性和鲁棒性,将人体置于相机前的不同距离进行实验,实验在每个固定距离内重复三次,结果如表1所示,人体参数测量值在恒定值的周围存在微小波动,a(平均)和s(标准偏差)显示在表的最后一列。当距离为1.2m或1.8m时,由表可以看出标准偏差较大。原因是当人体距离传感器太近或太远时,kinect检测的人体骨骼数据是不准确的。因此,人体参数测量存在固有误差。此外,当人体穿着不同时也会影响实验结果。

此外,本设计的体积测量方法与散射随机点法进行了比较,实验结果如图16所示。随机点法的误差随点数的增加而不断增大,相比之下,使用本设计提出的方法误差要小得多。此外,本设计提出的方法需要更少的处理时间,表现出良好的准确性和有效性。两种方法都在8gram、i7-4790、cpu3.6ghz配置的电脑上运行,并且体素网格分辨率为228×50×200。

实验例三:参数测量精度

为了评估参数测量精度,本设计扫描固定在转台上的盒子。盒子的真实体积和周长可以提前确定。然而,由于盒子缺乏有效的3d特征,在icp配准阶段将无法正确地找到匹配点,因此将导致3d重建失败。实验中通过将毛绒玩具放在盒子上以增加3d特征来解决此问题,实验实施图如图17所示。然后可以获得相机的可靠轨迹,并整合盒子的3d模型。测量和评估结果列在表2中。其中,盒子的真实体积为30268.58ml,实际周长为1586mm。

图18显示了人体和体积已知的盒子的总体积测量,将结果表示为volh+b,表3中展示了人体和盒子总体积的测量结果和精度。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1