[0031] 下面将结合附图对本发明加以详细说明,应指出的是,所描述的实施例仅旨在便于对本发明的理解,而对其不起任何限定作用。
[0032] 本发明旨在兼顾精度、效率和成本的前提下,充分考虑到用户使用时的隐私需求,运用图像处理技术以及深度学习技术从手机或相机拍摄的人体的背、侧面的二维图像中提取出人体的轮廓以及人体目标点,并自动计算相应的精确尺寸数据。通过本发明可以让国内外的用户只需上传几张照片即可获得精确的人体尺寸,下面将参考附图详细介绍本发明的实施例。
[0033] 图1是本发明测量方法的流程图,展示了从网络训练及图像输入到检测完毕的整个流程。
[0034] 步骤S1:利用语义分割网络DeepLab V3+在COCO数据集上训练得到能够将人体与复杂背景分离的网络模型。
[0035] 这里不再赘述网络是如何训练的,通过该方法可获得针对人体的语义分割网络模型。该模型将一幅图像中的所有像素点标记为属于人体的像素点和不属于人体的像素点即为背景。使用此网络模型,可以让用户在拍摄照片时,无需过多考虑背景复杂程度以及光线强弱等问题。同时,使用深度网络进行人体语义分割得到的人体轮廓效果也好于直接使用图像处理技术提取人体轮廓的效果。
[0036] 步骤S2:获取对象背、侧面图像,图像的宽高比为6:9,分辨率越高越好。拍摄要求:拍摄角度与地面平行,同时拍摄中心与人体中心对齐;拍摄时,要求对象两脚分开比肩宽稍大,脚尖竖直向前,两臂与地面呈45度角向下伸展,两手手掌向前,大拇指自然向上,其余四指并拢且伸直。拍摄侧面图时,对象站姿应保持与背面图相同,双臂及手不能超出人体前后轮廓线。
[0037] 步骤S3:根据步骤S1训练所得网络模型定位由步骤S2获取的对象背、侧面图像中人体坐标与遮罩。
[0038] 步骤S4:根据步骤S3获得的人体坐标与遮罩,使用OpenCV的图像处理技术提取出以人体对象为中心的二值图;
[0039] 具体地,将步骤S3中获取到的所有人体坐标所在的像素点的值置为255,即表现为纯白色,其它非人体所在的坐标置为像素值0,即表现为纯黑色。根据人体特征分别确定头顶、脚底的y坐标以及身体左侧和右侧的x坐标,并分别向身体外侧拓展10像素点进行裁剪,得到以人体为中心的二值图像。实例如图2(a)和图2(b)所示,用户最终上传的图像即为此二值化的人体图像,充分保护用户隐私。
[0040] 步骤S5:依据人体各部位的表现特征,对步骤S4所得人体二值图进行像素扫描,定位各个特征点所在坐标。
[0041] 具体地,特征点有头顶点、脚底点、左侧点、右侧点、颈点、腋窝点、臀高点、胸高点、腹高点、肩点、肩颈点、腰高点、大腿根点等。
[0042] 下面,将对特征点具体算法进行说明。其中,部分特征点如头顶点、脚底点、左侧点、右侧点等公知部分不再赘述。其中,臀高点、胸高点、腹高点等已有多种成熟方法的部分也不再赘述。
[0043] 具体地,颈点包括背面图的颈高点以及侧面图的前颈点、后颈点。
[0044] 具体地,颈高点算法如下:
[0045] ①在背面图中,从头顶向下10%的身高处开始到身高的30%,分别记录每一行的白色像素点的数量,其中白色像素点数量最少的一行认为是背面图中脖子的位置,取其中点为颈高点。若存在多行相同,取中值;
[0046] 具体地,如图3所示,前颈点、后颈点算法如下:
[0047] ①在侧面图中,从头顶向下10%的身高处开始到身高的30%,分别记录每一行的白色像素点的数量,其中白色像素点数量最少的一行认为是侧面图脖子的位置。在该行上下5%身高的范围内找到脖子前颈部最凹的坐标,即为前颈点的位置。若存在多行相同,取中值;
[0048] ②在侧面图中,根据前颈点的位置,在前颈点上方10%身高的范围内找到距离前颈点最近的身体轮廓上的点,即为后颈点;
[0049] 具体地,如图4所示,腋窝点算法如下:
[0050] ①在背面图中,通过映射侧面图胸高点高度得到背面图胸高点高度,令背面图颈高点高度到胸高点高度距离为g;
[0051] ②在背面图中,从颈高点往下g/2的高度到身高的50%区域内逐行从人体的中轴线开始向左侧遍历,当某行发生两次黑白二值变换,则停止该侧遍历,该行首次二值变换点即为左腋窝点K1。类似方法可得右腋窝点K2。
[0052] 具体地,肩点算法如下:
[0053] ①在背面图中,分别自左、右腋窝点向上查找,与身体轮廓的交点认为是左、右肩点。
[0054] 具体地,肩颈点算法如下:
[0055] ①在背面图中,取颈高点所在行的最外侧白色像素点(分别为左颈点、右颈点)与同侧肩点水平距离为c;
[0056] ②在背面图中,自左颈点水平向外c/3距离做垂线交身体轮廓于点A;
[0057] ③在背面图中,取左颈点和点A范围内人体轮廓上距离左颈点和点A连线最远的点,即为左肩颈点。类似方法可得右肩颈点。
[0058] 具体地,腰高点算法如下:
[0059] ①在背面图中,在人体身高60%的高度往上4%到这个高度往下2%的范围内扫描每一行的白色像素点的数量,其中白色像素点数量最少的一行的躯干中心点认为是背面腰高点;
[0060] 具体地,前、后腰点算法如下:
[0061] ①在侧面图中,根据获取到的背面腰高点的高度映射到侧面图中,得到侧面腰高点的高度。其中,侧面腰高点高度与腹部轮廓的交点为前腰点,侧面腰高点高度与背部轮廓的交点为后腰点。
[0062] 具体地,大腿根点算法如下:
[0063] ①在背面图中,于身高的60%开始自上而下逐行扫描。每行自人体轮廓外侧开始,从左向右扫描,直到另一侧人体轮廓外侧为止。当首次扫描经历了四次黑白像素值变换时停止,并取其第二次和第三次像素值变换位置的中点竖直向下1%身高的位置为大腿根点。
[0064] 步骤S6:根据步骤S5所得特征点坐标计算二维图像中人体部位的长度尺寸,即第一尺寸组;
[0065] 具体地,第一尺寸组有身高、体宽、颈宽、颈厚、胸宽、胸厚、腰宽、腰厚、臀宽、臀厚、大腿根宽、大腿根厚、腹宽、腹厚等。
[0066] 下面对第一尺寸组进行具体算法说明。其中,第一尺寸组如身高、体宽等公知部分不再赘述。其中,颈宽、胸厚、腰宽、腰厚、臀宽、臀厚、大腿根宽、大腿根厚、腹宽、腹厚等已有成熟方法的部分不再赘述。
[0067] 具体地,颈厚算法如下:
[0068] ①在侧面图中,前颈点与后颈点间的距离即为颈厚。
[0069] 具体地,胸宽算法如下:
[0070] ①在背面图中,若侧面图胸高点高度映射到背面图的高度低于手臂与身体躯干的交点,则自胸高点分别向左右两侧遍历,直到躯干轮廓时停止,胸宽即为此行遍历的白色像素点个数;
[0071] ②在背面图中,若侧面图胸高点高度映射到背面图的高度高于手臂与身体躯干的交点,则自两个手臂与身体躯干较低的交点的下一行中点向左右两侧遍历,直到躯干轮廓时停止,此时胸宽即为此行遍历的白色像素点个数。
[0072] 步骤S7:根据步骤S5所得的特征点坐标以及步骤S6中获取的人体部位长度尺寸,将目标人体的体型分成多个类别,分别对应不同的体型,并以此使用不同的围度算法;
[0073] 具体地,将腰宽除以臀宽,根据结果将体型分为较瘦、正常、较胖三类,在下述第二尺寸组的胸围、腰围、腹围、臀围、前胸宽、后背宽的围度计算公式中使用不同的系数。
[0074] 步骤S8:根据步骤S7对体型的判定使用不同的计算公式获取人体三维围度尺寸,即第二尺寸组。
[0075] 具体地,第二尺寸组有颈围、肩宽、胸围、腰围、腹围、臀围、大腿根围、前腰节、后腰节、前胸宽、后背宽、臂围、袖笼、袖口、袖长等。
[0076] 下面对第二尺寸组,也即为制作旗袍所需的尺寸组进行具体算法说明。其中,第二尺寸组计算中,部分围度如颈围、胸围、腰围、腹围、臀围、大腿根围等直接使用第一尺寸组的数据代入经大量数据拟合得到的公式进行计算,例如腰围使用腰宽和腰厚进行拟合,臀围使用臀宽和臀厚进行拟合等,在此不再赘述。
[0077] 具体地,肩宽算法如下:
[0078] ①在背面图中,自左肩点积分至左肩颈点,记白色像素点个数为s1;
[0079] ②在背面图中,自右肩点积分至右肩颈点,记白色像素点个数为s2;
[0080] ③在背面图中,记左肩颈点至右肩颈点距离为s3;
[0081] ④将s1,s2,s3代入公式L=s1+s2+s3求得肩宽。
[0082] 具体地,如图5(a)所示,前腰节算法如下:
[0083] ①在侧面图中,依据背面图中肩颈点高度映射得侧面图中肩颈点的高度,x坐标取靠后背的3/7处;
[0084] ②在侧面图中,肩颈点至前颈点的直线距离为fw1;
[0085] ③在侧面图中,自前颈点起沿人体轮廓(即白色像素点边缘)积分至胸高点,积分距离记为fw2;
[0086] ④在侧面图中,胸高点至前腰点直线距离为fw3;
[0087] ⑤将fw1,fw2,fw3代入公式L1=e1*fw1+e2*fw2+fw3求得前腰节长度,其中e1、e2为拟合得到的系数。
[0088] 具体地,如图5(b)所示,后腰节算法如下:
[0089] ①在侧面图中,在一定身高区间内测得背部最突出的点,即为背部最厚处点;
[0090] ②在侧面图中,测得肩颈点到背部最厚处点的距离为bw1;
[0091] ③在侧面图中,测得后背最厚处到后腰点直线距离为bw2;
[0092] ④将bw1,bw2代入公式L2=e3*bw1+bw2求得后腰节长度,其中e3为拟合得到的系数。
[0093] 具体地,前胸宽、后背宽算法如下:
[0094] ①由于测量前胸宽、后背宽时,要求两臂自然下垂测量左右两侧腋窝上端点之间的距离,此时二维图像无法正确表示腋窝上端点的空间位置。因此在背面图中,定位两臂自然下垂时腋窝上端点为J1、J2点,如图4所示,J1、J2点算法如下:在背面图中,自K1点竖直向下身体1%高度所在行与人体躯干轮廓的交点即为J1点,类似方法可得J2点;
[0095] ②在侧面图中,通过映射背面图中J1点的高度得到侧面图中J1点的高度所在行为m。前颈点垂直向下与行m交于一点,该点与身体前侧轮廓的水平距离为fb。后颈点垂直向下与行m交于一点,该点与背部轮廓的水平距离为bb;
[0096] ③将背面图中J1、J2点的距离d与fb代入公式L3=α*d+β*fb得前胸宽,其中α、β为拟合得到的系数。将背面图中J1、J2点的距离d与bb代入公式L4=γ*d+σ*bb得后背宽,其中γ、σ为拟合得到的系数。
[0097] 具体地,臂围算法如下:
[0098] ①在背面图中,自腋窝点开始,向身体外侧45度做直线与身体轮廓交于一点,计算腋窝点与该点的距离,即为臂围的宽,记为p1;
[0099] ②将p1代入公式W=θ*p1求得臂围,其中θ为拟合得到的系数。
[0100] 具体地,袖笼算法如下:
[0101] ①在背面图中,腋窝点至肩点距离记为q1;
[0102] ②根据人体切片模型判断,袖笼的短轴可用臂围的宽代替,即p1;
[0103] ③将q1,p1代入椭圆公式求得袖笼,其中q1为长轴,p1为短轴,系数为拟合所得。
[0104] 具体地,袖口、袖长算法如下:
[0105] ①在背面图中,在虎口与前臂范围内查找手臂最细处,记其白色像素点个数为i;
[0106] ②在背面图中,自手臂最细处向指尖方向遍历,取白色像素点个数为i+3且最靠近指尖的线作为手腕线。手腕线与手臂上方的交点即为腕点,手腕线的长度为腕宽n;
[0107] ③将n代入公式Z=λ*n求得袖口,其中λ为拟合得到的系数;
[0108] ④在背面图中,沿人体轮廓自腕点积分至肩点,记录长度为n1;
[0109] ⑤在背面图中,记录腕点与肩点的直线距离n2;
[0110] ⑥将n1,n2代入公式L5=ε*(n1+n2)/2求得袖长,其中ε为拟合得到的系数。
[0111] 如上所示,本发明虽然已参照有限的附图进行了说明,但在本发明所属领域中具备通常知识的人均可以从此记载中进行各种修改和变形。由此,其他实施例及权利要求书与等同物均属于权利要求的保护范围。