一种基于人脸检测和关键点定位的人体组件划分方法
【技术领域】
[0001] 本发明属于计算机图像处理技术领域,具体涉及一种基于人脸检测和关键点定位 的人体组件划分方法。
【背景技术】
[0002] 视频或图片中人体的组件划分可以服务于人体精确三维重建、人体组件测量和 行为识别等诸多相关领域的研宄和实际应用。在过去的十几年中,这一问题的研宄吸引 了诸多研宄这的关注。文献l:Haritaoglu,D.Harwood,andL.S.Davis, "W4:Real_time surveillanceofpeopleandtheiractivities, "IEEETrans.PatternAnal.Mach. Intell.,vol. 22,no. 8,pp. 809 - 830,Aug. 2000.提出了一种递归凸壳算法来构造基于轮廓 模型寻找可能的身体部位。文献 2:S.S.Micilotta,E.J.Ong,andR.Bowden,"Detecting andtrackingofhumansbyprobabilisticbodypartassembly, "inProc. BritishMachineVisionConf.,Sep. 2005,vol.l,pp. 429 - 438?使用几种提前用 Adaboost算法训练过的身体部分探测器检测到了不同的身体部位。文献3:S.Weik andC.E.Liedtke,"Hierarchical3Dposeestimationforarticu-latedhuman bodymodelsfromasequenceofvolumedata, "inProc.Int.WorkshopRobot Vis. ,Auckland,NewZealand,Feb. 2001,pp. 27 - 34?跟踪沿着身体的轮廓负的最小曲 率,然后使用修正迭代最近点算法分析每个身体部位。文献4 :Y.Song,L.Goncalves,and P.Perona,"Unsupervisedlearningofhumanmotion, "IEEETrans.PatternAnal. Mach.Intell. ,vol. 25,no. 7,pp. 814 - 827,Jul. 2003.提出了一种基于角的方法研宄人类 的姿势,并从视频序列中确定身体部分。文献5:Jun-WeiHsieh,Chi-HungChuang,and Sin-YuChenetal,"SegmentationofHumanBodyPartsUsingDeformable Triangulation,IEEETrans.Systems,Man,AndCybernetics,vol. 40,no. 3,May2010 提 出一种新颖的三角分割算法来做躯干定位的基础算法。但总体来说仍然具有一些较为明显 的不足,主要包括(1)没有考虑快速剔除"类似人体形状"的预处理,(2)可能需要大量的训 练图片。
【发明内容】
[0003] 发明目的:本发明的目的是针对以上人体组件划分方法的缺陷和不足,提出一种 解决人体组件划分问题的新思路、新方法。
[0004] 为实现所述目的,本发明使用比较成熟人脸检测算法进行人脸定位,再根据人脸 位置和轮廓上的关键点信息进行组件划分。其特征是在输入图像后,包括以下处理步骤:
[0005] 步骤1,输入无肢体重叠的人体图像,在图像中使用Adaboost学习算法,即基于 Haar-like级联分类器的人脸检测方法进行人脸检测,根据检测得到的人脸的位置信息确 定人脸的中心和人脸的的半径;
[0006] 步骤2,根据人脸的位置信息检测得到对应的人体外轮廓;
[0007] 步骤3,基于十字链表结构在检测得到的人体轮廓上进行关键点定位;
[0008] 步骤4,利用关键点将人体轮廓划分成各人体组件的轮廓。
[0009] 其中,步骤2包括:使用Canny算子进行边缘检测,找出人体图像中所有物体的外 轮廓集合私},1£{1,2,一,111},且(;=妒」(父」,¥」)},_]_£{1,2,.",11},111、11为大于1的 自然数,Pj(Xj,Yj)表示外轮廓上的像素点,Y」分别表示外轮廓上的像素点的横坐标和 纵坐标,I和分别表示检测得到的人脸中心横坐标、人脸中心纵坐标和人脸半径,满 足如下公式:
[0012] 其中外轮廓集合{CJ中元素最多的轮廓为人体轮廓。
[0013] 步骤3包括如下步骤:
[0014] 步骤3-1,采用十字链表的存储结构对人体外轮廓上的像素点的简单链式结构进 行重组,并进行关键点的查找和定位,关键点包括:人脸中心点1个、人体颈部左右边缘关 键点共2个、人体左臂和右臂的上界点以及人体左臂和右臂的下界点共4个、人体腰部左右 边缘关键点共2个、人体裤裆中点1个;
[0015] 步骤3-2,建立十字链表:对人体外轮廓上的像素点列进行一次逐点链式扫描,在 扫描过程中,扫描第一个点时,分别建立一个行头指针和一个列头指针,都指向扫描的这个 点,再新建一个总指针,向右指向行头指针,向下指向列头指针,然后按人体外轮廓的链式 结构逐个扫描其它点时,如属于已创建行或列,便按行或列坐标顺序加入十字链表中,如不 属于已创建行或列,便新建一个行或列头指针,先将此指针加入行或列头指针链中,再把指 针指向该扫描点,统计每行和每列的点个数total,并用index标识每个点在被读取出来的 序号即在被读取出来时是第几个;
[0016] 步骤3-3,确定人体颈部左、右边缘关键点,算法步骤如下:
[0017]步骤3-3-1,获取十字链表行链坐标Y= 的行指针;
[0018] 步骤3-3-2,遍历十字链表中所有点Pj,若存在点Pj的横坐标Xj满足XQ-RQ〈Xj〈XQ^lJ Pj为人体颈部左边缘关键点,若Pj为十字链表中最后一个点且XyXjO^+l,则Pj为人体颈 部右边缘关键点,若人体颈部左右边缘关键点全找到,则算法终止,否则执行步骤3-3-3 ;
[0019] 步骤3-3-3,行指针上移一行,若行链坐标Y=Y〇-R〇,算法终止;
[0020] 步骤3-3-4,重复步骤3-3-2~步骤3-3-3。
[0021 ] 步骤3-4,确定人体裤裆中点关键点,算法步骤如下:
[0022] 步骤3-4-1,获取十字链表行链坐标Y= (2RQX5. 5/4)X(1-0. 467)/ (l-〇.844)-(YQ-RQ)的行指针;
[0023]步骤3-4-2,遍历十字链表中所有点Pj,若存在点Pj的横坐标X」满足XA〈Xj〈XB,则 执行步骤3-4-3,PJPPB分别表示人体颈部左、右边缘关键点,XJPXB分别为人体颈部左、 右边缘关键点的横坐标,若不存在且行指针未移动过,执行步骤3-4-4,若不存在且行指针 移动过,执行步骤3_4_5 ;
[0024] 步骤3-4-3,定义当前行链坐标为Yk,逐行向上遍历十字链表中行链坐 标满足Yk〈Y〈 =Yk-h〇G的行,其中h〇G为肚脐到臀部下边缘的竖直高度,h〇G= (2R0X5. 5/4)X(0? 600-0. 467)八1-0. 844),若十字链表中存在点P」的横坐标X」满足 XA〈X^XB的行链,将行指针上移到此行,继续执行步骤3-4-2,否则执行步骤3-4-5 ;
[0025]步骤3-4-4,逐行向下遍历十字链表中所有点Pj,找到第一个存在点横坐标X」 满足XA〈Xj〈XB的行;
[0026]步骤3-4-5,遍历步骤3-4-4找到的行中所有的点,|X」-(XA+XB) /2 |最小的点即为 人体裤裆中点关键点;
[0027] 步骤3-5,确定人体腰部左右边缘关键点,算法步骤如下:
[0028] 步骤3-5-1,获取十字链表中行链坐标Y=Y^hoG的行指针,表示人体裤裆中点 关键点,表示点Px的纵坐标;
[0029] 步骤3-5-2,若行链坐标Y>1,则执行步骤3-5-3,否则遍历十字链表中所有点,若 存在横坐标\满足XfWoS/^K= 的点Pp&表示点P 横坐标,其中Xj最小的点P』 是人体腰部左边缘关键点,若存在满足X'X' =XfWoS/2的点匕,其中\最大的点P」是 人体腰部右边缘关键点,WoS为肩宽,若人体腰部左、右边缘关键点并未全找到,则执行步骤 3-5-4,若人体腰部左、右边缘关键点全找到,则算法终止;
[0030] 步骤3-5-3,将WoS更新为WoS+5 (5是经验值,它的存在是为了扩大搜索腰部点 的横向范围,它可以取大于0的任意整数,取值过小,重复执行步骤3-5-2的次数将会过 多,取值过大,有可能将手臂上的点确定为腰部上的点,所以折中考虑取值为5),执行步骤 3_5_1,若本步骤执行超过四次,算法终止;
[0031] 步骤3-5-4,行指针下移一行,返回执行步骤3-5-1
[0032] 步骤3-6,确定人体左臂和右臂的上界点,以及人体左臂和右臂的下界点,算法步 骤如下:
[0033] 步骤3-6-1,令十字链表中所有点的序号index减去一个值使得(index)A= 0, (index)A表示点PA被读取出来的序号;
[0034] 步骤3-6-2,获取列链坐标X=X。的列指针,P表示人体腰部左边缘关键点,X^表 示点Pc的横坐标;
[0035] 步骤3-6-3,遍历十字链表中所有点Pj,对于手指所在点PF,(index)岸于 (index)A加上人体颈部左边缘关键点到手指所在点的曲线距离,若存在点P』满足(index) A〈(index)』〈(
index)F,则此点为人体左臂上界点,执行步骤3-6-4,若不存在,则执行步骤 3-6-5,(index)」表示点Pj被读取出来的序号,(index)F表示点PF被读取出来的序号;
[0036] 步骤3-6-4,遍历十字链表中所有点,若存在点P」满足(index)A〈(index) j〈(index)j^P(index)j-(index)A>(index)e-(index)j,则此点为人体左臂下界点,算法终 止,若不存在,则执行步骤3-6-5,(index)表示点P。被读取出来的序号;
[0037] 步骤3-6-5,列指针左移一列,返回执行步骤3-6-2。
[0038]步骤4包括:利用建立好的人体外轮廓像素点的十字链表结构,从第一个点开始 逐个取出点建立第一个人体轮廓,首先按链式结构扫描到人体颈部右边缘关键点后,开始 逐个读点并将读取的点写入新建的人体轮廓中,直到遇到人体颈部左边缘关键点就停止读 入,完成人体头部轮廓;
[0039] 新建第二个人体轮廓,扫描到人体左臂上界点后,开始逐个读点并将读取的点写 入新建的第二个人体轮廓中,直到遇到人体左臂下界点就停止读入,完成人体左臂轮廓;
[0040] 新建第三个人体轮廓,扫描到人体腰部左边缘关键点后,开始逐个将点读入新建 的第三个人体轮廓中,直到遇到人体裤裆中点关键点就停止读入,完成左腿轮廓;
[0041] 新建第四个人体轮廓,从人体裤裆中点关键点开始逐个将点读入新建的第四个人 体轮廓中,直到遇到人体腰部右边缘关键点就停止读入,完成右腿轮廓;
[0042] 新建第五个人体轮廓,扫描到人体右臂下界点后,开始逐个将点读入新建的第五 个人体轮廓中,直到遇到人体右臂上界点就停止读入,完成右臂轮廓。
[0043] 假设原始人体轮廓在读点出来时逐点扫描的旋转方向是顺时针旋转,新建轮廓的 顺序与逆时针旋转时相反,每个轮廓读入的第一个点和最后一个点也刚好与之相反。
[0044] 本发明中包括哈尔特征、AdaBoost算法和Canny边缘检测算子。哈尔特征 (Haar-likefeatures)是用于物体识别的一种数字图像特征。它们因为与哈尔小波转换极 为相似而得名,是一种实时的人脸检测算子。AdaBoost,是英文"AdaptiveBoosting"(自适 应增强)的缩写,是一种机器学习方法,由YoavFreund和RobertSchapire提出。AdaBoost 方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法 对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学 习算法而言,不会很容易出现过拟合现象。AdaBoost方法中使用的分类器可能很弱(比如 出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于 〇. 5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为 在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。 Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘检测算法。
[0045] 有益效果:采用本发明的方法,输入无肢体重叠的图像或者视频,可自动完成人体 组件的划分。可进一步用于人体的三维重建、人体组件的自动测量和动作识别等领域。该 方法具有较高的通用型,可适用于多种工程领域。
【附图说明】
[0046] 下面结合附图和【具体实施方式】对本发明做更进一步的具体说明,本发明的上述和 /或其他方面的优点将会变得更加清楚。
[0047] 图1为本发明流程图。
[0048] 图2为人体的关键点不意图
[0049] 图3为轮廓像素点沿轮廓的链式结构。
[0050] 图4a~图4d为躯干分割示例1。
[0051] 图5a~图5d为躯干分割不例2。
【具体实施方式】
[0052] 本发明提出的一种基于人脸检测和关键点定位的人体组件划分方法的基本出发 点是通过使用较为成熟的人脸检测算法,通过人脸识别确定人脸的中心点和半径。再根据 人脸位置和大小,准确定位人体轮廓,再根据人体各部分比例的约束关系,在轮廓上寻找关 键点,根据关键点和轮廓信息实现人体组件的划分。
[0053] 本发明使用比较成熟人脸检测算法进行人脸定位,再根据人脸位置和轮廓上的关 键点信息进行组件划分。其特征是在输入图像后,包括以下处理步骤:
[0054] 步骤1,输入无肢体重叠的人体图像,在图像中使用Adaboost学习算法,即基于 Haar-like级联分类器的人脸检测方法进行人脸检测,根据检测得到的人脸的位置信息确 定人脸的中心和人脸的的半径;
[0055] 步骤2,根据人脸的位置信息检测得到对应的人体外轮廓;
[0056] 步骤3,基于十字链表结构在检测得到的人体轮廓上进行关键点定位;
[0057] 步骤4,利用关键点将人体轮廓划分成各人体组件的轮廓。
[0058] 其中,步骤2包括:使用Canny算子进行边缘检测,找出人体图像中所有物体的外 轮廓集合私},1£{1,2,一,111},且(;=妒」(父」,¥」)},_]_£{1,2,.",11},111、11为大于1的 自然数,Pj(Xj,Yj)表示外轮廓上的像素点,Y」分别表示外轮廓上的像素点的横坐标和 纵坐标,I和分别表示检测得到的人脸中心横坐标、人脸中心纵坐标和人脸半径,满 足如下公式:
[0061] 其中外轮廓集合{CJ中元素最多的轮廓为人体轮廓。
[0062]步骤3包括如下步骤:
[0063] 步骤3-1,采用十字链表的存储结构对人体外轮廓上的像素点的简单链式结构进 行重组,并进行关键点的查找和定位,关键点包括:人脸中心点1个、人体颈部左右边缘关 键点共2个、人体左臂和右臂的上界点以及人体左臂和右臂的下界点共4个、人体腰部左右 边缘关键点共2个、人体裤裆中点1个;
[0064] 步骤3-2,建立十字链表:对人体外轮廓上的像素点列进行一次逐点链式扫描,在 扫描过程中,扫描第一个点时,分别建立一个行头指针和一个列头指针,都指向扫描的这个 点,再新建一个总指针,向右指向行头指针,向下指向列头指针,然后按人体外轮廓的链式 结构逐个扫描其它点时,如属于已创建行或列,便按行或列坐标顺序加入十字链表中,如不 属于已创建行或列,便新建一个行或列头指针,先将此指针加入行或列头指针链中,再把指 针指向该扫描点,统计每行和每列的点个数total,并用index标识每个点在被读取出来的 序号即在被读取出来时是第几个;
[0065] 步骤3-3,确定人体颈部左、右边缘关键点,算法步骤如下:
[0066] 步骤3-3-1,获取十字链表行链坐标Y= 的行指针;
[0067]步骤3-3-2,遍历十字链表中所有点Pj,若存在点Pj的横坐标满足XjX^R/XjOC。,则Pj为人体颈部左边缘关键点,若Pj为十字链表中最后一个点且XyXjO^+l,则Pj为人体颈 部右边缘关键点,若人体颈部左右边缘关键点全找到,则算法终止,否则执行步骤3-3-3;
[0068] 步骤3-3-3,行指针上移一行,若行链坐标Y=Y〇-R(),算法终止;
[0069] 步骤3-3-4,重复步骤3-3-2和步骤3-3-3。
[0070] 步骤3-4,确定人体裤裆中点关键点,算法步骤如下:
[0071] 步骤3-4-1,获取十字链表行链坐标Y= (2RQX5. 5/4)X(1-0. 467)/ (l-〇.844)-(YQ-RQ)的行指针;
[0072]步骤3-4-2,遍历十字链表中所有点Pj,若存在点Pj的横坐标X』满足XA〈Xj〈XB,则 执行步骤3-4-3,PJPPB分别表示人体颈部左、右边缘关键点,XJPXB分别为人体颈部左、 右边缘关键点的横坐标,若不存在且行指针未移动过,执行步骤3-4-4,若不存在且行指针 移动过,执行步骤3_4_5 ;
[0073] 步骤3-4-3,定义当前行链坐标为Yk,逐行向上遍历十字链表中行链坐 标满足Yk〈Y〈 =Yk-h〇G的行,其中h〇G为肚脐到臀部下边缘的竖直高度,h〇G= (2R0X5. 5/4)X(0? 600-0. 467)八1-0. 844),若十字链表中存在点P」的横坐标X」满足 XA〈X^XB的行链,将行指针上移到此行,继续执行步骤3-4-2,否则执行步骤3-4-5 ;
[0074]步骤3-4-4,逐行向下遍历十字链表中所有点Pj,找到第一个存在点P#横坐标X」 满足XA〈Xj〈XB的行;
[0075]步骤3-4-5,遍历步骤3-4-4找到的行中所有的点,|X」-(XA+XB) /2 |最小的点即为 人体裤裆中点关键点;
[0076] 步骤3-5,确定人体腰部左右边缘关键点,算法步骤如下:
[0077] 步骤3-5-1,获取十字链表中行链坐标Y=Y^hoG的行指针,表示人体裤裆中点 关键点,表示点Px的纵坐标;
[0078] 步骤3-5-2,若行链坐标Y>1,则执行步骤3-5-3,否则遍历十字链表中所有点,若 存在横坐标\满足XfWoS/^K= 的点Pp&表示点P 横坐标,其中Xj最小的点P』 是人体腰部左边缘关键点,若存在满足X'X' =XfWoS/2的点匕,其中\最大的点P」是 人体腰部右边缘关键点,WoS为肩宽,若人体腰部左、右边缘关键点并未全找到,则执行步骤 3-5-4,若腰部左、右边缘关键点全找到,则算法终止;
[0079] 步骤3-5-3,将WoS
更新为WoS+5 (5是经验值,它的存在是为了扩大搜索腰部点 的横向范围,它可以取大于0的任意整数,取值过小,重复执行步骤3-5-2的次数将会过 多,取值过大,有可能将手臂上的点确定为腰部上的点,所以折中考虑取值为5),执行步骤 3_5_1,若本步骤执行超过四次,算法终止;
[0080] 步骤3-5-4,行指针下移一行,返回执行步骤3-5-1
[0081] 步骤3-6,确定人体左右臂上下界点,算法步骤如下:
[0082] 步骤3-6-1,令十字链表中所有点的序号index减去一个值使得(index)A= 0, (index)A表示点PA被读取出来的序号;
[0083] 步骤3-6-2,获取列链坐标X=X。的列指针,P表示人体腰部左边缘关键点,X^表 示点Pc的横坐标;
[0084] 步骤3-6-3,遍历十字链表中所有点Pj,对于手指所在点PF, (index) F等于 (index)A加上人体颈部左边缘关键点到手指所在点的曲线距离,若存在点P』满足(index) A〈(index)』〈(index)F,则此点为人体左臂上界点,执行步骤3-6-4,若不存在,则执行步骤 3-6-5,(index)」表示点Pj被读取出来的序号,(index)F表示点PF被读取出来的序号;
[0085] 步骤3-6-4,遍历十字链表中所有点,若存在点P」满足(index)A〈(index) j〈(index)j^P(index)j-(index)A>(index)e-(index)j,则此点为人体左臂下界点,算法终 止,若不存在,则执行步骤3-6-5,(index)表示点P。被读取出来的序号;
[0086]步骤3-6-5,列指针左移一列,返回执行步骤3-6-2。
[0087] 步骤4包括:利用建立好的人体外轮廓像素点的十字链表结构,从第一个点开始 逐个取出点建立第一个人体轮廓,首先按链式结构扫描到人体颈部右边缘关键点后,开始 逐个读点并将读取的点写入新建的人体轮廓中,直到遇到人体颈部左边缘关键点就停止读 入,完成人体头部轮廓;
[0088] 新建第二个人体轮廓,扫描到人体左臂上界点后,开始逐个读点并将读取的点写 入新建的第二个人体轮廓中,直到遇到人体左臂下界点就停止读入,完成人体左臂轮廓; [0089] 新建第三个人体轮廓,扫描到人体腰部左边缘关键点后,开始逐个将点读入新建 的第三个人体轮廓中,直到遇到人体裤裆中点关键点就停止读入,完成左腿轮廓;
[0090] 新建第四个人体轮廓,从人体裤裆中点关键点开始逐个将点读入新建的第四个人 体轮廓中,直到遇到人体腰部右边缘关键点就停止读入,完成右腿轮廓;
[0091] 新建第五个人体轮廓,扫描到人体右臂下界点后,开始逐个将点读入新建的第五 个人体轮廓中,直到遇到人体右臂上界点就停止读入,完成右臂轮廓。
[0092] 实施例
[0093] 如图1所示。图1中步骤1是初始化动作。步骤2输入一张无交叉的正脸人体图 像。
[0094] 步骤3采用的是基于Adaboost学习算法的人脸检测方法,也即基于Haar-like级 联分类器的人脸检测方法。
[0095] 步骤4根据检测到的人脸位置信息,寻找对应的人体轮廓。先使用Canny算子进行 边缘检测,找出图像中所有物体的外轮廓集合lAHie{1,2,…,!11}),且(;={P^XpYj)} (jG{1,2,…,n}),Pj(Xj,Yj)指轮廓上的像素点。满足
和
(其中X。、Y。和R。分别为检测到人脸中心横纵坐标和人脸半径)且Ci元素最 多的轮廓为人体轮廓。
[0096] 步骤5完成人体轮廓十字链表的建立。如图3所示,为轮廓像素点沿轮廓的链式结 构。对人体轮廓点列进行一趟逐点链式扫描,在此过程中,扫描第一个点时,先分别建立一 个行头指针和一个列头指针,都指向这个点,再新建一个总指针,向右指向行头指针,向下 指向列头指针,然后按轮廓的链式结构逐个扫描其它点时,如属于已创建行(或列),便按 行(或列)坐标顺序加入十字链表中,如不属于已创建行(或列),便新建一个行(或列) 头指针,先将此指针加入行(或列)头指针链中,再把它指向该扫描点。统计每行和每列的 点个数total,并用index标识每个点在被读取出来时是第几个。
[0097] 步骤6确定人体颈部左右边缘关键点,其步骤如下:
[0098] (i)获取行链坐标Y=YQ+R。的行指针;
[0099] (ii)遍历链中所有点Pi,若\成0^0(。,则Pi即为人体颈部左边缘关键点,若Pi 为链中最后一个点且则Pi为人体颈部右边缘关键点,若人体颈部左右边缘关 键点全找到,则算法终止,否则执行(iii);
[0100] (iii)指针上移一行,若行链坐标Y=Y。-!?。,算法终止;
[0101] (iv)重复第ii步和第iii步。
[0102] 步骤7确定人体裆部中心点,其步骤如下:
[0103] ⑴获取行链坐标Y= (2RQX5. 5/4)X(1-0. 467V(l-0. 844)-(YQ-R。)的行指针, 此处是将扫描行大体定位到人体中部的一行,利用了表1经验知识头顶到臀部下边缘的竖 直高度与头顶到肩部的竖直高度之比为(1-0. 467V(l-0. 844)和头顶到肩部的列方向距 离大致等于人脸圆的直径的5. 5/4倍;
[0106] 表 1
[0107] (ii)遍历链中所有点Pp若存在点满足X/X'Xb,则进行第iii步,若不存在且行 指针未移动过,进行第iv步,若不存在且行指针移动过,进行第v步;
[0108] (iii)假设当前行链坐标为Y」,逐行向上遍历行链坐标满足Yj〈Y〈 =Yj-hoG 的行,其中h〇G为肚脐到臀部下边缘的竖直高度,根据经验知识肚脐到臀部下边缘 的竖直高度与头顶到肩部的竖直高度之比为(0.600-0. 467V(l-0. 844)得到h〇G= (2RQX5. 5/4)X(0. 600-0. 467)八1-0. 844),若存在链中点满足X/X'Xb的行链,将行指针 上移到此行,继续执行第ii步,否则进行第v步;
[0109] (iv)逐行向下遍历,找到第一个存在点满足X/X'Xb的行;
[0110] (V)遍历行中所有点,|X「(XA+XB) /2I最小的点即为裤裆中点。
[0111]步骤8确定人体腰部左右边缘关键点,其步骤如下:
[0112] (i)获取行链坐标Y=YfhoG的行指针;
[0113] (ii)若行链坐标,则执行第iii步,否则遍历链中所有点,若存在满足 XfWoS/^K= 的点,其中Xi最小的是人体腰部左边缘关键点,若存在满足= XfWoS/2的点,其中Xi最大的是人体腰部右边缘关键点。若两点并未全找到,则执行第iv 步,若两点全找到,则算法终止;
[0114] (iii)WoS=WoS+5,执行第i步,若此步执行超过四次,算法终止;
[0115] (iv)行指针下移一行。
[0116] 步骤9确定人体手臂上下边界点,其步骤如下:
[0117] (i)令所有点的index减去一个值使得(index)A= 0 ;
[0118] (ii)获取列链坐标X=Xe的列指针;
[0119] (iii)遍历链中所有点Py若存在点满足(index)A〈(index)i〈(index)r则此点为 人体左臂上界点,执行第iv步,若不存在,则执行第v步;
[0120] (iv)遍历链中所有点Pp若存在点满足(index) A〈 (index)i〈 (index):和(index) i-Qndex^Mindexh-Qndexh,则此点为人体左臂下界点,算法终止,若不存在,则执行第v步;
[0121] (V)列指针左移一列。
[0122] 步骤10利用关键点划分人体轮廓。如图2所示,为人体的关键点示意图,其中HEAD 为十字链表表头,A为颈部左边缘关键点,B为颈部右边缘关键点,C为左臂上界点,D为左臂 下界点,E为右臂上界点,F为右臂下界点,G为腰部左边缘,H为腰部右边缘关键点,I为裆 部中心点,0为人脸中心点,确定了起始点和最开始读点时的旋转方向,利用所有轮廓点沿 轮廓的链式结构,从第一个点开始逐个取出点建立新的分割轮廓。如图3所示,为轮廓筛选 示意图。假设原始人体轮廓在读点出来时逐点扫描的旋转方向是逆时针旋转,则按链式结 构扫描到颈部右边缘关键点后,开始逐个读点读入新建的轮廓中,直到遇到颈部左边缘关 键点就停止读入,头部轮廓完成。新建第二个轮廓,扫描到左臂上界点后,开始逐个将点读 入新建的轮廓中,直到遇到左臂下界点就停止读入,左臂轮廓完成。新建第三个轮廓,扫描 到腰部左边缘关键点后,开始逐个将点读入新建的轮廓中,直到遇到裤裆中点就停止读入, 左腿轮廓完成。新建第四个轮廓,从裤裆中点开始逐个将点读入新建的轮廓中,直到遇到腰 部右边缘关键点就停止读入,右腿轮廓完成。新建第五个轮廓,扫描到右臂下界点后,开始 逐个将点读入新建的轮廓中,直到遇到右臂上界点就停止读入,右臂轮廓完成。假设原始人 体轮廓在读点出来时逐点扫描的旋转方向是顺时针旋转,新建轮廓的顺序与逆时针旋转时 相反,每个轮廓读入的第一个点和最后一个点也刚好与之相反。
[0123] 步骤11利用关键点测量人体组件。根据成对关键点的位置信息,可计算组件的相 对长度,也即是使用像素点的个数来表示组件长度。
[0124] 步骤12程序结束,完成人体组件划分的结果如图4a~图4d和图5a~图5d所 示,图4a为含有人体和非人体
(将人体的轮廓视为干扰物)原图像,图4b为图4a的划分 结果;图4c为只含人体的原图像,图4d为图4c的划分结果;图5a为含有单个人体的原图 像,图5b为图5a的轮廓划分结果;图5c为含有多个人体的原图像,图5d为图5c的划分结 果。
[0125] 本发明提供了一种基于人脸检测和关键点定位的人体组件划分方法,具体实现该 技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术 领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这 些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技 术加以实现。
【主权项】
1. 一种基于人脸检测和关键点定位的人体组件划分方法,其特征在于,包括以下步 骤: 步骤1,输入无肢体重叠的人体图像,在图像中使用Adaboost学习算法,即基于 Haar-Iike级联分类器的人脸检测方法进行人脸检测,根据检测得到的人脸的位置信息确 定人脸的中心和人脸的半径; 步骤2,根据人脸的位置信息检测得到对应的人体外轮廓; 步骤3,基于十字链表结构在检测得到的人体轮廓上进行关键点定位; 步骤4,利用关键点将人体轮廓划分成各人体组件的轮廓。2. 如权利要求1所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤2包括:使用Canny算子进行边缘检测,找出人体图像中所有物体的外轮廓集合 IA},i e {1,2,…,m},且Ci= (Pj(XjJj)K j e {1,2,…,n},m、η为大于 1 的自然数, Pj(Xj) Yj)表示外轮廓上的像素点,X,Y j分别表示外轮廓上的像素点的横坐标和纵坐标, I和R0分别表示检测得到的人脸中心横坐标、人脸中心纵坐标和人脸半径,满足如下公 式:其中外轮廓集合ICJ中元素最多的轮廓为人体轮廓。3. 如权利要求2所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤3包括如下步骤: 步骤3-1,采用十字链表的存储结构对人体外轮廓上的像素点的简单链式结构进行重 组,并进行关键点的查找和定位,关键点包括:人脸中心点1个、人体颈部左右边缘关键点 共2个、人体左臂和右臂的上界点以及人体左臂和右臂的下界点共4个、人体腰部左右边缘 关键点共2个、人体裤裆中点1个; 步骤3-2,建立十字链表:对人体外轮廓上的像素点列进行一次逐点链式扫描,在扫描 过程中,扫描第一个点时,分别建立一个行头指针和一个列头指针,都指向扫描的这个点, 再新建一个总指针,向右指向行头指针,向下指向列头指针;然后按人体外轮廓的链式结构 逐个扫描其它点,如扫描的点属于已创建行或列,便按行或列坐标顺序加入十字链表中,如 不属于已创建的行或列,便新建一个行或列头指针,先将此指针加入行或列头指针链中,再 把指针指向该扫描点,统计每行和每列的点个数,并用index标识每个扫描的点在被读取 出来的序号; 步骤3-3,确定人体颈部左、右边缘关键点; 步骤3-4,确定人体裤裆中点关键点; 步骤3-5,确定人体腰部左、右边缘关键点; 步骤3-6,确定人体左臂和右臂的上界点,以及人体左臂和右臂的下界点。4. 如权利要求3所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤3-3包括如下步骤: 步骤3-3-1,获取十字链表行链坐标Y = YfRtj的行指针; 步骤3-3-2,遍历十字链表中所有点Ρ」,若存在点Pj的横坐标X j满足X ^R/XjO^,则Pj为人体颈部左边缘关键点,若Pj为十字链表中最后一个点且X yXjO^+%,则Pj为人体颈部 右边缘关键点,若人体颈部左右边缘关键点全找到,则算法终止,否则执行步骤3-3-3 ; 步骤3-3-3,行指针上移一行,若行链坐标Y = Yo-Ro,算法终止; 步骤3H,重复步骤3-3-2~步骤3-3-3。5. 如权利要求4所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤3-4包括如下步骤: 步骤3-4-1,获取十字链表中满足下式的行链坐标Y的行指针: Y = (2R〇X5. 5/4) X (1-0. 467)/(1-0. 844)-(Y0-R0); 步骤3-4-2,遍历十字链表中所有点Pj,若存在点Pj的横坐标X」满足X Α〈Χ」〈ΧΒ,PjP P B分别表不人体颈部左、右边缘关键点,XjR X B分别为人体颈部左、右边缘关键点的横坐标, 则执行步骤3-4-3,若不存在且行指针未移动过,执行步骤3-4-4,若不存在且行指针移动 过,执彳丁步骤3_4_5 ; 步骤3-4-3,定义当前行链坐标为Yk,逐行向上遍历十字链表中行链坐标满足Yk〈Y〈= Yk-h〇G的行,其中h〇G为肚脐到臀部下边缘的竖直高度: hoG = (2R〇X5. 5/4) X (0. 600-0. 467)/(1-0. 844), 若十字链表中存在点&的横坐标X#足XA〈X/XB,将行指针上移到此行,继续执行步骤 3-4-2,否则执行步骤3-4-5 ; 步骤3-4-4,逐行向下遍历十字链表中所有点Pj,找到第一个存在点横坐标X』满 足XA〈Xj〈XB的行; 步骤3-4-5,遍历步骤3-4-4找到的行中所有的点,判定|Xj-(XA+XB)/2|最小的点即为 人体裤裆中点关键点。6. 如权利要求5所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤3-5包括如下步骤: 步骤3-5-1,获取十字链表中行链坐标Y = Y1-IioG的行指针,?1表示人体裤裆中点关键 点,Y1表示点P :的纵坐标; 步骤3-5-2,若行链坐标Y>Yp则执行步骤3-5-3,否则遍历十字链表中所有点,若存在 横坐标\满足X fWoS/^K = X^X1的点P ρ X1表示点P 横坐标,其中L最小的点h是人体 腰部左边缘关键点,若存在满足X1OC/ = XfWoS/2的点h,其中\最大的点L是人体腰部 右边缘关键点,WoS为肩宽,若人体腰部左、右边缘关键点并未全找到,则执行步骤3-5-4, 若人体腰部左、右边缘关键点全找到,则算法终止; 步骤3-5-3,将WoS更新为WoS+5,执行步骤3-5-1,若本步骤执行超过四次,算法终止; 步骤3-5-4,行指针下移一行,返回执行步骤3-5-1。7. 如权利要求6所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤3-6包括如下步骤: 步骤3-6-1,令十字链表中所有点的序号index减去一个值使得(index)A=0,(index) A表示点Pa被读取出来的序号; 步骤3-6-2,获取列链坐标X = Xe的列指针,P e表示人体腰部左边缘关键点,X e表示点 Pe的横坐标; 步骤3-6-3,遍历十字链表中所有点,对于手指所在点PF, (index)F等于(index) &加 上人体颈部左边缘关键点到手指所在点的曲线距离,若存在点Pj满足(index) A〈 (index) j〈(index)F,则此点为人体左臂上界点,执行步骤3-6-4,若不存在,则执行步骤3-6-5, (index)』表示点Pj被读取出来的序号,(index) F表示点Pf被读取出来的序号; 步骤3-6-4,遍历十字链表中所有点,若存在点Pj满足(index) A〈 (index)」〈(index) #口 (index)(index) A> (index) G- (index)」,则此点为人体左臂下界点,算法终止,若不存在,则 执行步骤3-6-5,(index)e表示点Pe被读取出来的序号; 步骤3-6-5,列指针左移一列,返回执行步骤3-6-2。8.如权利要求7所述的一种基于人脸检测和关键点定位的人体组件划分方法,其特征 在于,步骤4包括: 利用建立好的人体外轮廓像素点的十字链表结构,从第一个点开始逐个取出点建立第 一个人体轮廓,首先按链式结构扫描到人体颈部右边缘关键点后,开始逐个读点并将读取 的点写入新建的人体轮廓中,直到遇到人体颈部左边缘关键点就停止读入,完成人体头部 轮廓; 新建第二个人体轮廓,扫描到人体左臂上界点后,开始逐个读点并将读取的点写入新 建的第二个人体轮廓中,直到遇到人体左臂下界点就停止读入,完成人体左臂轮廓; 新建第三个人体轮廓,扫描到人体腰部左边缘关键点后,开始逐个将点读入新建的第 三个人体轮廓中,直到遇到人体裤裆中点关键点就停止读入,完成左腿轮廓; 新建第四个人体轮廓,从人体裤裆中点关键点开始逐个将点读入新建的第四个人体轮 廓中,直到遇到人体腰部右边缘关键点就停止读入,完成右腿轮廓; 新建第五个人体轮廓,扫描到人体右臂下界点后,开始逐个将点读入新建的第五个人 体轮廓中,直到遇到人体右臂上界点就停止读入,完成右臂轮廓。
【专利摘要】本发明提供了一种基于人脸检测和关键点定位的人体组件划分方法。该方法主要针对无肢体重叠的图像进行人体组件的划分,包括输入人体图像,利用人脸检测技术定位人体的大致范围,通过边缘检测获取准确的人体轮廓,再使用十字链表存储和检索方法,从而完成基于关键点查找的人体组件的自动划分。本方法借用比较成熟的人脸检测算法来完成人脸识别,再根据人脸信息大致定位人体位置并提取出准确的人体轮廓,然后根据人体的比例约束,在人体的外轮廓上搜索和定位关键点,最后根据这些关键点快速分离出各个身体组件的轮廓。该方法具有较好的实时性和较高的准确率,可以用于人体的三维重建、人体的测量以及行为识别等诸多领域。
【IPC分类】G06K9/00, G06K9/62
【公开号】CN104899575
【申请号】CN201510347507
【发明人】杨若瑜, 马旋
【申请人】南京大学
【公开日】2015年9月9日
【申请日】2015年6月19日