发明内容
本发明的目的在于提供一种3D骨架建模与手检测方法,解决现有技术无法完整显示人的轮廓,并且实时的生成人体的3D骨架模型,得到各个关节点的3D坐标的问题。
为解决上述的技术问题,本发明采用以下技术方案:
一种3D骨架建模与手检测方法,包括步骤:
步骤一,用深度摄像机拍摄人物视频;
步骤二,在视频中进行人脸检测;
步骤三,提取人体轮廓;
步骤四,对人体轮廓进行验证,判断是否是人体轮廓,是,则进行下一步,否,则返回到人脸检测步骤;
步骤五,进行图像滤波与平滑处理,并使用细化算法提取骨架线;
步骤六,计算人体部位距离,建立概率分布图;
步骤七,识别人体各部位,得到各关节点的坐标;
步骤八,连接各个关节点,形成完整的3D人体骨架;
步骤九,输出3D人体骨架与手的坐标;
步骤十,跟踪人体轮廓,并为下一帧提供信息。
其中,所述步骤提取人体轮廓包括如下具体步骤:
从人脸中心点开始,向四周扩展找出所有与此深度相近的像素点,并保持区域连通性。即对一个像素点,判断其是否在区域边界上,如果不在边界上,则把当前点置位,并递归处理其上方、下方、左方、右方的像素点,直到整个图像扩展完毕。最后得到人体轮廓二值图像。
其中,所述步骤对人体轮廓进行验证包括如下具体步骤:
在得到人体轮廓二值图像后,用“凸模板”进行验证。如附图3所示,区域1即是“凸模板”,我们把“凸模板”放在人脸区域,并用以下公式计算:
式中,S1是区域1的面积,S2是区域2的面积;
然后,判断C是否大于预定阈值,是,则认为此处是人脸;否,则认为此处不是人脸。
其中,所述步骤进行图像滤波与平滑处理并使用细化算法提取骨架线包括步骤:
用图像滤波算法使图像平滑;
再用图像降采样的方法使图像更加平滑;
用细化算法提取人体骨架线,得到人体骨架线图像。
其中,所述步骤计算人体部位距离并建立概率分布图包括步骤:
在人体轮廓二值图像中,对每个白色像素点,统计坐标x,y的平均值,得到人体重心点;
在细化的骨架线上,找一点与重心点距离最近,把此点作为“人体中心点”;
在人体轮廓二值图像中,对每个白色像素点,用深度值替代像素值,得到轮廓深度图;
计算骨架线上每个像素点到人体中心点的“线上最短距离”,将距离值存储于一个矩阵中,这个矩阵叫作M图。
在人体轮廓二值图像中,对每个白色像素点,用以下公式计算人体部位距离(HBPD,Human Body Part Distance):
式中,Di,j表示人体部位距离,Depthi,j表示当前像素点的深度,DepthC表示人体中心点的深度,Li,j是从当前像素点到骨架线的最近距离,对应骨架线上最近的点是(i2,j2),从M图中可以获取位于坐标(i2,j2)处的数值Mi2,j2;
在轮廓深度图中,统计所有点的人体部位距离的平均值,各个像素点的人体部位距离大于平均值并且大于阈值T1的分为一类,距离小于平均值并且小于阈值T2的分为另一类,用如下数学公式表示:
式中,Ci,j是分类结果,n是轮廓区域中像素点的个数,A是轮廓区域,E是所有点的距离平均值,T1,T2是两个经验阈值参数;
将分类结果存储于一个新的图像中,得到概率分布图。
其中,所述“线上最短距离算法”能用于计算复杂曲线上两点间最短距离,“线上最短距离算法”包括步骤:
在线上有两个点需要计算最近距离,我们将这两个点分别标记为点A和点B;
新建一个矩阵,矩阵与图像有相同的宽度和高度,对骨架线图像中的每个像素点进行判断,如果是白色像素,则将矩阵中对应位置的标记置位,如果是黑色像素,则将矩阵中对应位置的标记清空;
在点A和点B中任选一个点,从此点开始,进行递归运算;
在当前点处,把距离值加1,同时把对应标记清空,表示此点已计算过;
递归处理线上每个像素点,每次移动一格,判断此点是否已到达目标点,是,则返回距离值,否,则计算此点上方、下方、左方、右方的点的距离,选择最小距离,并返回距离值;
判断上方、下方、左方、右方是否都不存在白色且状态置位的点,是,则返回-1,否,则递归直到所有路径已计算过。
其中,所述步骤识别人体各部位包括步骤:
用一个矩形框将Body区域框住;
在矩形框四个角点处得到4个关节点,左肩、右肩、左臀、右臀;
在矩形框中,找到位于两肩之间的颈部关节点,找到位于中心点附近的腰部关节点;
在概率分布图中,提取出Limbs区域,在这个区域中,将人体部位距离大的一端作为四肢的端点,将人体部位距离小的一端作为中间关节点。
其中,所述步骤跟踪人体轮廓包括步骤:
根据上一帧图片中人体轮廓的位置,用位置与运动速度估算下一帧图片中人体轮廓可能在的位置区域;
在可能的区域中,找到深度相近、形状相似的区域作为下一帧的人体轮廓。
与现有技术相比,本发明的有益效果是:能快速地检测到人,得到人体骨架线,并且精确定位每个人的关节点,建立3D骨架模型,运算速度快,计算复杂度低,适应各种复杂背景,每帧图像仅需5ms。
具体实施方式
下面通过具体的实施例子并结合附图对本发明做进一步的详细描述。
本发明实施例提供了一种3D骨架建模与手检测方法,参见图1所示,包括步骤:
步骤一,用深度摄像机拍摄人物视频;
步骤二,在视频中进行人脸检测;
步骤三,提取人体轮廓;
步骤四,对人体轮廓进行验证,判断是否是人体轮廓,是,则进行下一步,否,则返回到人脸检测步骤;
步骤五,进行图像滤波与平滑处理,并使用细化算法提取骨架线;
步骤六,计算人体部位距离,建立概率分布图;
步骤七,识别人体各部位,得到各关节点的坐标;
步骤八,连接各个关节点,形成完整的3D人体骨架;
步骤九,输出3D人体骨架与手的坐标;
步骤十,跟踪人体轮廓,并为下一帧提供信息。
其中,所述步骤提取人体轮廓包括如下具体步骤:
从人脸中心点开始,向四周扩展找出所有与此深度相近的像素点,并保持区域连通性。即对一个像素点,判断其是否在区域边界上,如果不在边界上,则把当前点置位,并递归处理其上方、下方、左方、右方的像素点,直到整个图像扩展完毕。最后得到人体轮廓二值图像。
其中,所述步骤对人体轮廓进行验证包括如下具体步骤:
在得到人体轮廓二值图像后,用“凸模板”进行验证。如附图3所示,区域1即是“凸模板”,我们把“凸模板”放在人脸区域,并用以下公式计算:
式中,S1是区域1的面积,S2是区域2的面积;
然后,判断C是否大于预定阈值,是,则认为此处是人脸;否,则认为此处不是人脸。
其中,所述步骤进行图像滤波与平滑处理并使用细化算法提取骨架线包括步骤:
用图像滤波算法使图像平滑;
再用图像降采样的方法使图像更加平滑;
用细化算法提取人体骨架线,得到人体骨架线图像。
其中,所述步骤计算人体部位距离并建立概率分布图包括步骤:
在人体轮廓二值图像中,对每个白色像素点,统计坐标x,y的平均值,得到人体重心点;
在细化的骨架线上,找一点与重心点距离最近,把此点作为“人体中心点”;
在人体轮廓二值图像中,对每个白色像素点,用深度值替代像素值,得到轮廓深度图;
计算骨架线上每个像素点到人体中心点的“线上最短距离”,将距离值存储于一个矩阵中,这个矩阵叫作M图。
在人体轮廓二值图像中,对每个白色像素点,用以下公式计算人体部位距离(HBPD,Human Body Part Distance):
式中,Di,j表示人体部位距离,Depthi,j表示当前像素点的深度,DepthC表示人体中心点的深度,Li,j是从当前像素点到骨架线的最近距离,对应骨架线上最近的点是(i2,j2),从M图中可以获取位于坐标(i2,j2)处的数值Mi2,j2;
在轮廓深度图中,统计所有点的人体部位距离的平均值,各个像素点的人体部位距离大于平均值并且大于阈值T1的分为一类,距离小于平均值并且小于阈值T2的分为另一类,用如下数学公式表示:
式中,Ci,j是分类结果,n是轮廓区域中像素点的个数,A是轮廓区域,E是所有点的距离平均值,T1,T2是两个经验阈值参数;
将分类结果存储于一个新的图像中,得到概率分布图。
其中,所述“线上最短距离算法”能用于计算复杂曲线上两点间最短距离,“线上最短距离算法”包括步骤:
在线上有两个点需要计算最近距离,我们将这两个点分别标记为点A和点B;
新建一个矩阵,矩阵与图像有相同的宽度和高度,对骨架线图像中的每个像素点进行判断,如果是白色像素,则将矩阵中对应位置的标记置位,如果是黑色像素,则将矩阵中对应位置的标记清空;
在点A和点B中任选一个点,从此点开始,进行递归运算;
在当前点处,把距离值加1,同时把对应标记清空,表示此点已计算过;
递归处理线上每个像素点,每次移动一格,判断此点是否已到达目标点,是,则返回距离值,否,则计算此点上方、下方、左方、右方的点的距离,选择最小距离,并返回距离值;
判断上方、下方、左方、右方是否都不存在白色且状态置位的点,是,则返回-1,否,则递归直到所有路径已计算过。
其中,所述步骤识别人体各部位包括步骤:
用一个矩形框将Body区域框住;
在矩形框四个角点处得到4个关节点,左肩、右肩、左臀、右臀;
在矩形框中,找到位于两肩之间的颈部关节点,找到位于中心点附近的腰部关节点;
在概率分布图中,提取出Limbs区域,在这个区域中,将人体部位距离大的一端作为四肢的端点,将人体部位距离小的一端作为中间关节点。
其中,所述步骤跟踪人体轮廓包括步骤:
根据上一帧图片中人体轮廓的位置,用位置与运动速度估算下一帧图片中人体轮廓可能在的位置区域;
在可能的区域中,找到深度相近、形状相似的区域作为下一帧的人体轮廓。
其中,所述细化算法包括步骤:
用Rosenfeld8算法对图像进行细化,此算法能很好地提取骨架线,且骨架线满足连通性、单线性,这是很有用的。对比Hilditch算法、Deutch算法、PatternThin算法、Naccche算法、Pavlidisl算法、Pavlidis2算法等,可以看出,Rosenfeld8的性能明显优于其它算法。
当然,这里还可以选用2.5D细化算法,2.5D细化算法的性能是较好的。这里仅是一个实施例,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。
其中,步骤识别人体部位可以用到以下公式,从而提高准确度:
LNeck_Shoulder:LShoulder_Elbow:LElbw_Hand=1∶1∶2
LWaist_Hip:LHip_Knee:LKnee_Foot=1∶2∶2
式中,LNeck_Shoulder是从脖子到肩的长度,LShoulder_Elbow是从肩到肘的长度,LElbw_Hand是从肘到手掌的长度,LWaist_Hip是腰到臀的长度,LHip_Knee是臀到膝的长度,LKnee_Foot是膝到脚的长度。
其中,识别人体部位时,当产生模棱两可的情形时,可以用以下步骤得到更好的识别结果:
当识别结果模棱两可时,我们能生成多个骨架模型。把各个关节点连起来,我们得到多个人体模型。然后,计算各个人体模型与真实深度图的相似度,相似度计算公式如下:
式中,L1到Ln是连接骨架关节点的n条线,D1代表由人体模型估算得到的深度信息,D2代表真实的深度图像。Sj是连接骨架各关节点的线上的点集。α是一个比例系数。
式中,J1到Jm是m个关节点,x1,y1代表当前图像帧中的关节点,x2,y2代表上一个图像帧中的关节点。
S=SI+SJ
式中,S是总的相似度,SI计算由计算机产生的骨架与真实世界中真实场景的相似度,SJ计算当前图像帧中的骨架与上一个图像帧中的骨架的相似度,并滤除噪声。
我们用以下算法获得多个模型中最好的3D人体骨架:
式中,K是最好的骨架识别结果,k是假设的骨架模型数量。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。