发明内容
本申请提出基于虚拟换装的服装变形方法、装置、设备及存储介质,本申请根据用户图像和服装模板图像计算变形前后的坐标映射矩阵。利用坐标映射矩阵,进行变形,使变形后的服装区域与用户图像更加吻合,提高虚拟换装效果,简化了服装变形的运算量,提高了服装变形的处理速率。
本申请第一方面实施例提出了基于虚拟换装的服装变形方法,包括:
获取待换装的用户图像和服装模板图像;
根据所述用户图像和所述服装模板图像,确定所述服装模板图像中服装区域变形前后的坐标映射矩阵;
根据所述坐标映射矩阵对所述服装模板图像中的服装区域进行变形。
在本申请的一些实施例中,所述根据所述用户图像和所述服装模板图像,确定所述服装模板图像中服装区域变形前后的坐标映射矩阵,包括:
根据所述用户图像确定脖子关键点,以及获取所述服装模板图像对应的衣服关键点;
根据所述脖子关键点和所述衣服关键点,计算所述服装模板图像中服装区域变形前后的横坐标映射矩阵;
根据所述脖子关键点和所述衣服关键点,计算所述服装区域变形前后的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述用户图像确定预设数目个脖子关键点,包括:
通过预设人脸关键点检测模型检测所述用户图像中的所有人脸关键点;
根据所述用户图像对应的所述人脸关键点和预设标准人脸关键点,对所述用户图像进行人脸对齐;
通过预先训练的脖子关键点检测模型从对齐后的所述用户图像中识别出脖子关键点。
在本申请的一些实施例中,所述获取所述服装模板图像对应的衣服关键点,包括:
根据所述服装模板图像中预标注的虚拟人脸关键点和所述预设标准人脸关键点,对所述服装模板图像进行对齐处理;
根据所述服装模板图像中预标注的衣服关键点,从对齐处理后的所述服装模板图像中确定出对齐后的衣服关键点。
在本申请的一些实施例中,所述脖子关键点包括左右两侧脖子边界线与肩部相接处的两个关键点及锁骨区域位于脖子竖直中轴线上的一个关键点;所述衣服关键点包括领口左右两侧边界线的两个端点和所述左右两侧边界线的交点。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装模板图像中服装区域变形前后的横坐标映射矩阵,包括:
根据每个脖子关键点的横坐标,沿水平方向将所述用户图像的宽度划分为多段第一横坐标区间;
根据每个衣服关键点的横坐标,沿水平方向将所述服装模板图像的宽度划分为多段第二横坐标区间,所述第一横坐标区间的数目与所述第二横坐标区间的数目相等;
根据所述多段第一横坐标区间和所述多段第二横坐标区间,利用线性插值和变形坐标映射函数计算所述服装模板图像中服装区域对应的横坐标映射矩阵。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域变形前后的纵坐标映射矩阵,包括:
根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数;
根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数,包括:
根据每个脖子关键点的横坐标,沿水平方向将所述用户图像的宽度划分为多段第一横坐标区间;
根据所述服装模板图像的高度、所述脖子关键点和所述衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数;
根据所述多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算所述服装区域中每个横坐标对应的纵坐标的缩放系数。
在本申请的一些实施例中,所述根据所述脖子关键点和所述衣服关键点,计算所述服装区域中每个横坐标对应的纵坐标的缩放系数之前,还包括:
对所述服装模板图像中所述服装区域进行整体缩放处理,缩放后所述服装模板图像中领口边界线上纵坐标最大的关键点与所述用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合;
重新计算整体缩放处理后所述服装模板图像中的每个衣服关键点。
在本申请的一些实施例中,所述对所述服装模板图像中所述服装区域进行整体缩放处理,包括:
根据所述服装模板图像的高度、所述服装模板图像中领口左右两侧边界线的交点的纵坐标以及所述用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数;
根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及所述整体缩放系数,利用变形坐标映射函数计算所述服装区域在整体缩放处理前后的纵坐标映射矩阵。
在本申请的一些实施例中,所述重新计算整体缩放处理后所述服装模板图像中的每个衣服关键点,包括:
保持整体缩放处理后每个衣服关键点的横坐标不变;
根据所述服装模板图像的高度、所述整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
在本申请的一些实施例中,所述根据所述服装模板图像的高度、所述服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的纵坐标映射矩阵,包括:
根据所述服装模板图像的高度、所述整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算所述服装区域对应的最终的纵坐标映射矩阵。
在本申请的一些实施例中,所述根据所述坐标映射矩阵对所述服装模板图像中的服装区域进行变形,包括:
根据所述坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对所述服装模板图像中的服装区域进行水平方向的变形处理;
根据所述坐标映射矩阵包括的纵坐标映射矩阵,通过所述预设变形算法对所述服装区域进行竖直方向的变形处理。
本申请第二方面的实施例提供了一种基于虚拟换装的服装变形装置,包括:
获取模块,用于获取待换装的用户图像和服装模板图像;
确定模块,用于根据所述用户图像和所述服装模板图像,确定所述服装模板图像中服装区域变形前后的坐标映射矩阵;
变形模块,用于根据所述坐标映射矩阵对所述服装模板图像中的服装区域进行变形。
本申请第三方面的实施例提供了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序以实现上述第一方面所述的方法。
本申请第四方面的实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行实现上述第一方面所述的方法。
本申请实施例中提供的技术方案,至少具有如下技术效果或优点:
在本申请实施例中,根据用户图像中的脖子关键点和服装模板图像中的衣服关键点,确定服装区域变形前后的坐标映射矩阵,利用该坐标映射矩阵进行变形。巧妙的利用变形前后的几何关系,基于很少的关键点,采用线性插值和变形坐标映射函数计算服装区域变形前后的坐标映射矩阵,利用坐标映射矩阵对服装区域进行变形。既确保了服装变形具有很好的变形效果,又大大简化了服装变形的运算量,提高了服装变形的处理速率。
本申请附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变的明显,或通过本申请的实践了解到。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施方式。虽然附图中显示了本申请的示例性实施方式,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
需要注意的是,除非另有说明,本申请使用的技术术语或者科学术语应当为本申请所属领域技术人员所理解的通常意义。
下面结合附图来描述根据本申请实施例提出的基于虚拟换装的服装变形方法、装置、设备及存储介质。
虚拟换装是指将用户图像中的服装图像替换为服装模板图像中的服装图像。在换装过程中需要对服装图像进行适当变形。目前,相关技术中有IDW(Inverse DistanceWeighted,反距离加权)算法、MLS(移动最小二乘法)算法、基于三角剖分变形等变形方法。其中,基于三角剖分变形的方法,根据很多关键点对所要变形的区域进行三角剖分,增加了变形运算的复杂度。IDW算法和MLS算法可以使用较少的关键点进行变形,但关键点需要特殊选择,否则容易造成变形畸变。IDW算法和MLS算法都有很高的计算复杂度。
基于此,本申请实施例提供了一种基于虚拟换装的服装变形方法,该方法最少可使用三个关键点,根据用户图像和服装模板图像,确定服装区域变形前后的坐标映射矩阵,利用该坐标映射矩阵进行变形。巧妙的利用变形前后的几何关系,采用线性插值和变形坐标映射函数计算服装区域变形前后的坐标映射矩阵,既确保了服装变形具有很好的变形效果,又大大简化了服装变形的运算量,提高了服装变形的处理速率。
参见图1,该方法具体包括以下步骤:
步骤101:获取待换装的用户图像和服装模板图像。
在虚拟换装场景中,获取用户图像和服装模板图像。其中,用户图像可以为包括用户头颈部区域及颈部以下部分身体区域的图像,头颈部区域包括头部区域和脖子区域。服装模板图像中包括服装图像,该服装图像包括完整的领口区域及部分或完整的领口以下衣服区域。
步骤102:根据用户图像和服装模板图像,确定服装模板图像中服装区域变形前后的坐标映射矩阵。
本申请利用变形坐标映射函数来确定服装区域变形前后的坐标映射函数,首先初始化变形坐标映射函数,初始化的时候默认不变形,即变形后的横坐标和变形前的横坐标一致,变形后的纵坐标和变形前的纵坐标一致。变形坐标映射函数表示形式为一个二维矩阵,第一个下标为纵坐标,第二个下标为横坐标。若某个点纵坐标为j,横坐标为i,则map[j,i]表示其映射前的坐标。为计算方便,本申请实施例将横坐标映射和纵坐标映射分开计算,横坐标映射函数计为map_x,纵坐标映射函数计为map_y。
本步骤具体通过如下步骤S1-S3的操作来确定变形前后的坐标映射矩阵,包括:
S1:根据用户图像确定脖子关键点,以及获取服装模板图像对应的衣服关键点。
获取用户图像之后,通过预设人脸关键点检测模型检测用户图像中的所有人脸关键点,检测的人脸关键点包括用户图像中人物面部轮廓、眼睛、鼻子、嘴部、眼睛、眉毛等部位的人脸关键点。
本申请实施例中预先设置了标准人脸图像,并标注了该标准人脸图像中的所有预设标准人脸关键点。该标准人脸图像可以为五官无遮挡且两眼中心点连线与水平线平行的图像。根据用户图像对应的人脸关键点和预设标准人脸关键点,对用户图像进行人脸对齐。即将用户图像中的人脸关键点与预设的标准人脸图像中的预设标准人脸关键点对齐,具体可以将用户图像中五官的多个人脸关键点与预设的标准人脸图像中对应的标准人脸关键点对齐。例如,将用户图像的两个嘴角处、鼻尖、左右眼中心及两个眉毛中心的人脸关键点分别与预设的标准人脸图像中的对应的人脸关键点对齐。
将用户图像与预设的标准人脸图像对齐后,通过预先训练的脖子关键点检测模型从对齐后的用户图像中识别出脖子关键点,该脖子关键点至少包括左右两侧脖子边界线与肩部相接处的两个关键点及锁骨区域位于脖子竖直中轴线上的一个关键点。如图2所示的用户图像中,脖子关键点包括左右两侧脖子边界线与肩部相接处的两个关键点p2_d和p3_d,以及锁骨区域位于脖子竖直中轴线上的关键点p1_d。
服装模板图像中也可以包括模特人脸图像,通过模特穿着服装模板的图像,用户能够更加直观地看出服装模板的穿着效果。本申请实施例预先通过预设人脸关键点检测模型检测出服装模板图像中的模特人脸图像的所有人脸关键点,在该服装模板图像中预先标注这些人脸关键点,将标注的这些人脸关键点称为预标注的虚拟人脸关键点。根据服装模板图像中预标注的虚拟人脸关键点和上述标准人脸图像中的预设标准人脸关键点,对服装模板图像进行对齐处理。即通过拉伸变形操作将服装模板图像中多个预标注的虚拟人脸关键点与对应的预设标准人脸关键点对齐。
服装模板图像中还预标注了多个衣服关键点,该衣服关键点可以包括领口左右两侧边界线的两个端点和左右两侧边界线的交点,如图3所示。以服装模板图像的左上角顶点为原点,以服装模板图像的宽为x轴,以服装模板图像的高为y轴,如图3所示,则获取的衣服关键点可以包括领口边界线左右两侧纵坐标最小的两个关键点和领口边界线上纵坐标最大的一个关键点,即图3中的p2_o、p3_o和p1_o。
将服装模板图像与预设的标准人脸图像对齐之后,根据服装模板图像中预标注的衣服关键点,从对齐处理后的服装模板图像中确定出对齐后的衣服关键点。即对齐后,依据服装模板图像中预标注的衣服关键点和对齐处理过程中的拉伸程度,重新计算对齐后每个衣服关键点的坐标。
在本步骤中将用户图像和服装模板图像均与预设的标准人脸图像对齐,使用户图像和服装模板图像中服装区域的位置姿态均符合换装处理的要求,避免因二者位置姿态相差较大导致换装效果差的情况。且本步骤中获取的脖子关键点的数目和衣服关键点的数目相等,且脖子关键点的数目和衣服关键点的数目均至少可以为3个点,本申请确定的关键点数目较少,利用很少的关键点即可完成服装变形处理,减少了变形处理的计算量。
S2:根据脖子关键点和衣服关键点,计算服装模板图像中服装区域变形前后的横坐标映射矩阵。
根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间。其中,第一横坐标区间的数目为脖子关键点的数目加1。
如图2所示的用户图像中,该用户图像所处的坐标系如图2所示,用户图像的左上角顶点为原点。按p2_d、p1_d和p3_d三个脖子关键点的横坐标,可以将用户图像的宽度w划分为4段第一横坐标区间。划分出的4段第一横坐标区间从左到右依次为[0,p2_d[‘x’])、[p2_d[‘x’],p1_d[‘x’])、[p1_d[‘x’],p3_d[‘x’])和[p3_d[‘x’],w)。
根据每个衣服关键点的横坐标,沿水平方向将服装模板图像的宽度划分为多段第二横坐标区间。其中,第二横坐标区间的数目为衣服关键点的数目加1。由于脖子关键点的数目与衣服关键点的数目相等,因此第一横坐标区间的数目也与第二横坐标区间的数目相等。
如图3所示的服装模板图像,按p2_o、p1_o和p3_o三个脖子关键点的横坐标,可以将用户图像的宽度w划分为4段第二横坐标区间。划分出的4段第二横坐标区间从左到右依次为[0,p2_o[‘x’])、[p2_o[‘x’],p1_o[‘x’])、[p1_o[‘x’],p3_o[‘x’])和[p3_o[‘x’],w)。
对于划分出的多段第一横坐标区间和多段第二横坐标区间,第一横坐标区间的数目与第二横坐标区间的数目相等,且二者一一对应。即用户图像中从左到右第一个第一横坐标区间与服装模板图像中从左到右第一个第二横坐标区间对应,用户图像中的第二个第二横坐标区间与服装模板图像中第二个第二横坐标区间对应,如此一一对应。
例如,图2中的[0,p2_d[‘x’])与图3中的[0,p2_o[‘x’])对应,图2中的[p2_d[‘x’],p1_d[‘x’])与图3中的[p2_o[‘x’],p1_o[‘x’])对应,图2中的[p1_d[‘x’],p3_d[‘x’])与图3中的[p1_o[‘x’],p3_o[‘x’])对应,图2中的[p3_d[‘x’],w)与图3中的[p3_o[‘x’],w)对应。
对于用户图像中的一个第一横坐标区间及服装模板图像中相对应的第二横坐标区间,相当于具备了用户图像中横坐标为该第一横坐标区间的起始横坐标和横坐标为该第一横坐标区间的截止横坐标的两个点,假设将起始横坐标对应的点称为A点,将截止横坐标对应的点称为B点。同样地,相当于具备了服装模板图像中横坐标为该第二横坐标区间的起始横坐标和横坐标为该第二横坐标区间的截止横坐标的两个点,假设将服装模板图像中起始横坐标对应的点称为A’点,将截止横坐标对应的点称为B’点。则A点为服装区域变形后A’点对应的点,B点为服装区域变形后B’点对应的点。
即对于相互对应的第一横坐标区间和第二横坐标区间,相当于获得了变形前后相互对应的两对坐标点,则根据这两对坐标点能够确定一条直线,基于该直线进行线性插值,能够得到第二横坐标区间两端点之间的每个点的横坐标在用户图像中对应的点的横坐标。
例如,图2中的[0,p2_d[‘x’])与图3中的[0,p2_o[‘x’])对应,则相当于具有了用户图像中的点(0,y1)、(p2_d[‘x’],y1),此处y1可以为p2_d的纵坐标。以及获得了服装模板图像中的(0,y2)、(p2_ o [‘x’],y2),此处y2可以为p2_ o的纵坐标。其中,服装区域变形后点(0,y2)会变为点(0,y1),点(p2_ o [‘x’],y2)会变为点(p2_d[‘x’],y1)。根据这四个点确定一条直线,利用线性插值的方式确定出纵坐标均为y2,且横坐标在0至p2_ o [‘x’]之间的各个点,在变形后每个点的横坐标。
按照上述方式对于用户图像中划分出的每一段第一横坐标区间和服装模板图像中划分出的每一段第二横坐标区间,都可以采用线性插值的方式来确定服装模板图像中每个横坐标对应的变形后的横坐标。即根据多段第一横坐标区间和多段第二横坐标区间,利用线性插值和变形坐标映射函数计算服装模板图像中服装区域对应的横坐标映射矩阵。
例如,对于图2和图3中横坐标区间的划分方式,对每一段都采用线性插值方式,并使用numpy工具包可将4段的坐标映射过程合并写作下面的公式:
map_x[:, :] = np.interp(np.arange(w),[0, p2_d[‘x’], p1_d[‘x’], p3_d[‘x’], w - 1],[0, p2_o[‘x’], p1_o[‘x’], p3_o[‘x’], w - 1])
其中,w为用户图像和服装模板图像的宽度,interp(*)表示线性插值函数。
本步骤利用少数几个关键点(如3个关键点)将图像的横坐标划分多个横坐标区间,利用服装模板图像中的衣服关键点与用户图像中的脖子关键点的映射关系,通过线性插值的方式确定出服装模板图像中其他横坐标在用户图像中对应的变形后的横坐标,并采用变形坐标映射函数表达出变形前后横坐标的映射关系。如此只通过很少的关键点,利用简单的几何关系即可确定出变形前后的横坐标映射矩阵,计算量很小,能够快速准确地确定出变形前后的横坐标的映射关系。
S3:根据脖子关键点和衣服关键点,计算服装区域变形前后的纵坐标映射矩阵。
在一种实现方式中,首先根据脖子关键点和衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数。
具体地,根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间。划分方式与步骤S2中的划分方式相同,如图2中可以划分出4段第一横坐标区间从左到右依次为[0,p2_d[‘x’])、[p2_d[‘x’],p1_d[‘x’])、[p1_d[‘x’],p3_d[‘x’])和[p3_d[‘x’],w)。
然后根据服装模板图像的高度、脖子关键点和衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数。服装模板图像的高度与用户图像的高度相等。脖子关键点与衣服关键点的数目相等,且一一对应。例如,左侧脖子边界线上的脖子关键点与衣领左侧边界线的端部的衣服关键点对应,右侧脖子边界线上的脖子关键点与衣领右侧边界线的端部的衣服关键点对应,锁骨区域位于脖子竖直中轴线上的脖子关键点与衣领左右两侧边界线相交处的衣服关键点相对应。
对于相互对应的脖子关键点和衣服关键点,服装模板图像的高度减1,再减去该衣服关键点的纵坐标,得到第一差值。服装模板图像的高度(或用户图像的高度)减1,再减去对应的脖子关键点的纵坐标,得到第二差值。计算第一差值和第二差值的比值,该比值即为该衣服关键点的纵坐标对应的缩放系数。
例如,假设服装模板图像和用户图像的高度均为h。对于图2和图3中相互对应的脖子关键点和衣服关键点,如图2中的脖子关键点p2_d和图3中的衣服关键点p2_o,则衣服关键点p2_o的纵坐标对应的缩放系数为(h - 1 - p2_o[‘y’]) / (h - 1 - p2_d[‘y’])。同样地,图3中的衣服关键点p1_o的纵坐标对应的缩放系数为(h - 1 – p1_o[‘y’]) / (h -1 – p1_d[‘y’])。衣服关键点p3_o的纵坐标对应的缩放系数为(h - 1 – p3_o[‘y’]) / (h- 1 – p3_d[‘y’])。
通过上述方式计算出每个衣服关键点的纵坐标对应的缩放系数之后,根据用户图像中划分的多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算服装区域中每个横坐标对应的纵坐标的缩放系数。
对于用户图像中划分的每个第一横坐标区间,每个区间的起始点的横坐标和截止点的横坐标都分别对应于一个纵坐标的缩放系数。对于一个第一横坐标区间,根据起始点的横坐标及其对应的缩放系数,以及截止点的横坐标及其对应的缩放系数,能够确定该第一横坐标区间对应的一条直线,基于该直线进行线性插值,能够得到该第一横坐标区间两端点之间的每个点的横坐标下纵坐标对应的缩放系数。
例如,图2中的第一横坐标区间[p2_d[‘x’],p1_d[‘x’]),起始点的横坐标p2_d[‘x’]对应的纵坐标的缩放系数为(h - 1 - p2_o[‘y’]) / (h - 1 - p2_d[‘y’])。截止点的纵坐标p1_d[‘x’] 对应的纵坐标的缩放系数为(h - 1 – p1_o[‘y’]) / (h - 1 – p1_d[‘y’])。根据p2_d[‘x’]与(h - 1 - p2_o[‘y’]) / (h - 1 - p2_d[‘y’]),以及p1_d[‘x’]与(h - 1 – p1_o[‘y’]) / (h - 1 – p1_d[‘y’]),确定一条直线。基于该直线进行线性插值,能够得到p2_d[‘x’]与p1_d[‘x’]之间每个横坐标对应的纵坐标的缩放系数。
按照上述方式对于用户图像中划分出的每一段第一横坐标区间及区间端点对应的纵坐标的缩放系数,都可以采用线性插值的方式来确定每个第一横坐标区间内部每个横坐标对应的纵坐标的缩放系数。
例如,对于图2中划分的4个第一横坐标区间,对每一段都采用线性插值方式,并使用numpy工具包可将4段的线性差值过程合并写作下面的公式:
scale2 = np.interp(np.arange(w),[0, p2_d[‘x’], p1_d[‘x’], p3_d[‘x’],w - 1],[1, (h - 1 - p2_o[‘y’]) / (h - 1 - p2_d[‘y’]), (h - 1 - p1_o[‘y’]) /(h - 1 - p1_d[‘y’]),(h - 1 - p3_o[‘y’]) / (h - 1 - p3_d[‘y’]), 1])
其中,w为用户图像的宽度,interp(*)表示线性插值函数。
通过上述方式计算出服装模板图像中服装区域中每个横坐标对应的纵坐标的缩放系数,之后根据服装模板图像的高度、服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的纵坐标映射矩阵。
具体地利用如下的赋值公式来表示服装区域对应的纵坐标映射矩阵:
map_y[:, :] = h - 1 - map_y[:, :]* scale2[np.newaxis, :]
其中,h为用户图像和服装模板图像的高度,scale2为每个横坐标对应的纵坐标的缩放系数,等号右边的map_y[:, :]为变形前服装区域中每个点的坐标,等号左边的map_y[:, :]为变形后服装区域中每个点的坐标。变形前后服装区域中每个点的横坐标不变,纵坐标发生了改变。
在另一些实施例中,在通过上述方式计算服装区域中每个横坐标对应的纵坐标的缩放系数之前,考虑到在虚拟换装场景中,用户图像中的领口区域,很可能与服装模板图像中的领口区域相差较大。如用户图像的衣服为高领的,服装模板图像中的衣服领口较低;或者,用户图像中的衣服领口较低,而服装模板图像中的衣服领口较高。因此可以基于服装模板图像中领口左右两侧边界线相交处的衣服关键点与用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点,先对服装区域进行整体缩放处理,缩放后服装模板图像中领口边界线上纵坐标最大的关键点与用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合。
首先根据服装模板图像的高度、服装模板图像中领口左右两侧边界线的交点的纵坐标以及用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数。将服装模板图像的高度减一,再减去服装模板图像中领口左右两侧边界线的交点的纵坐标,得到第三差值。将服装模板图像的高度减一,再减去用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,得到第四差值。计算第三差值与第四差值之间的比值,该比值即为整体缩放系数。
例如,假设用户图像和服装模板图像的高度均为h,图2中锁骨区域位于脖子竖直中轴线上的脖子关键点为p1_d,图3中领口左右两侧边界线的交点为p1_o,则整体缩放系数为(h - 1 – p1_o[‘y’]) / (h - 1 – p1_d[‘y’])。
通过上述方式计算出整体缩放系数后,还根据服装模板图像的高度、服装区域每个坐标点的纵坐标及整体缩放系数,利用变形坐标映射函数计算服装区域在整体缩放处理前后的纵坐标映射矩阵。具体通过下述公式来计算整体缩放处理前后的纵坐标映射矩阵:
map_y[:, :] =(h - 1 - np.arange(h))[:, np.newaxis] * scale1
其中,h为图像高度,scale1为整体缩放系数。
通过上述方式计算出整体缩放系数,并确定出整体缩放处理前后的纵坐标映射矩阵之后,重新计算整体缩放处理后服装模板图像中的每个衣服关键点。具体地,保持整体缩放处理后每个衣服关键点的横坐标不变。根据服装模板图像的高度、整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
对于任意一个衣服关键点,首先将服装模板图像的高度减一,再减去整体缩放处理前该衣服关键点的纵坐标,计算得到的差值与整体缩放系数之间的比值。再利用服装模板图像的高度减一后再减去上述计算的比值,最终得到的差值即为整体缩放处理后该衣服关键点的纵坐标。
例如,对于图3中的衣服关键点p2_o、 p1_o和 p3_o,假设服装模板图像的高度为h,整体缩放系数为scale1。则整体缩放处理后p2_o的纵坐标变为h - 1 - (h - 1 - p2_o[‘y’]) / scale1。p1_o的纵坐标变为h - 1 - (h - 1 - p1_o[‘y’]) / scale1 = p1_d[‘y’]。p3_o的纵坐标变为h - 1 - (h - 1 - p3_o[‘y’]) / scale1。
通过上述方式重新计算出整体缩放处理后的每个衣服关键点的坐标,之后可以利用前文所述的方式,根据用户图像中的脖子关键点和重新计算的衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数,此处计算过程与前文相应过程相同,在此不再赘述。
之后根据服装模板图像的高度、上述计算的整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的最终的纵坐标映射矩阵。最终的纵坐标映射矩阵的公式为:
map_y[:, :] = h - 1 - map_y[:, :]* scale2[np.newaxis, :]
其中,h为用户图像和服装模板图像的高度,scale2为依据整体缩放处理后的衣服关键点计算的每个横坐标对应的纵坐标的缩放系数。等号右边的map_y[:, :]为整体缩放处理前后的纵坐标映射矩阵,等号左边的map_y[:, :]为变形后服装区域中每个点的坐标。变形前后服装区域中每个点的横坐标不变,纵坐标发生了改变。
在步骤102中利用较少的脖子关键点和衣服关键点,基于相互对应的脖子关键点和衣服关键点之间的几何关系,利用线性插值和变形坐标映射函数计算出了变形前后的横坐标映射矩阵和纵坐标映射矩阵,以很小的计算量准确地计算出了服装区域变形前后的坐标映射矩阵。且在计算纵坐标映射矩阵之前可以先对服装区域进行整体缩放,再计算每个横坐标对应的纵坐标的缩放系数,使对服装区域的变形处理更加细化,提高服装区域变形的精度,从而使变形后的服装区域与用户图像更加吻合,提高虚拟换装效果。
上述对服装区域的整体缩放处理可以只是虚拟处理,即不真正地对服装区域进行缩放,而只是计算出整体缩放系数,整体缩放处理后新的衣服关键点及整体缩放处理前后的纵坐标映射矩阵,进而根据这些参数计算出最终的变形前后的坐标映射矩阵。根据计算出的变形前后的横坐标映射矩阵和纵坐标映射矩阵,最后一起通过下述步骤103的操作来进行变形处理,以提高变形处理的效率。
步骤103:根据坐标映射矩阵对服装模板图像中的服装区域进行变形。
具体地,根据坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对服装模板图像中的的服装区域进行水平方向的变形处理。根据坐标映射矩阵包括的纵坐标映射矩阵,通过预设变形算法对服装区域进行竖直方向的变形处理。
上述预设变形算法可以包括重映射函数opencvremap,将步骤102计算出的横坐标映射矩阵、纵坐标映射矩阵以及服装模板图像输入opencvremap函数中,输出变形后的服装模板图像。
变形后的服装模板图像中的每个衣服关键点都与用户图像中相对应的脖子关键点的坐标相同,且服装模板图像中除衣服关键点外的其他像素点的坐标也都发生了相应变化。变形后的服装模板图像与用户图像高度吻合,依据变形后的服装模板图像生成服装区域对应的服装掩膜,按照服装掩膜将变形后的服装模板图像覆盖到用户图像中,得到换装效果图。
如图4所示,根据图2所示的用户图像和图3所示的服装模板图像,对图3中的服装区域进行变形处理后,将图3中变形后的服装区域覆盖到图2中得到的换装效果图。从图4中可以看出对服装区域进行变形之后再进行虚拟换装,能够使得服装区域与用户图像高度吻合,得到了很好的换装效果。
为了便于理解本申请实施例提供的服装变形过程,下面结合附图进行说明。如图5所示,首先获取用户图像和服装模板图像,分别对用户图像和服装模板图像进行对齐。然后检测用户图像中的脖子关键点,以及获取服装模板图像中的衣服关键点。根据衣服关键点和脖子关键点,计算服装y方向上的整体缩放系数scale1。根据脖子关键点将用户图像划分为多段第一横坐标区间,根据衣服关键点将服装区域划分为多段第二横坐标区间。在scale1的基础上计算y方向对应的纵坐标映射矩阵。以及根据划分的多段第一横坐标区间和第二横坐标区间,计算x方向对应的横坐标映射矩阵。利用横坐标映射矩阵和纵坐标映射矩阵对服装模板图像中的服装区域进行变形,得到变形后的服装模板图像。
在本申请实施例中,根据用户图像中的脖子关键点和服装模板图像中的衣服关键点,确定服装区域变形前后的坐标映射矩阵,利用该坐标映射矩阵进行变形。巧妙的利用变形前后的几何关系,基于很少的关键点,采用线性插值和变形坐标映射函数计算服装区域变形前后的坐标映射矩阵,利用坐标映射矩阵对服装区域进行变形。既确保了服装变形具有很好的变形效果,又大大简化了服装变形的运算量,提高了服装变形的处理速率。
本申请实施例还提供一种基于虚拟换装的服装变形装置,用于执行上述任一实施例提供的基于虚拟换装的服装变形方法。如图6所示,该装置包括:
获取模块201,用于获取待换装的用户图像和服装模板图像;
确定模块202,用于根据用户图像和服装模板图像,确定服装模板图像中服装区域变形前后的坐标映射矩阵;
变形模块203,用于根据坐标映射矩阵对服装模板图像中的服装区域进行变形。
确定模块202,用于根据用户图像确定脖子关键点,以及获取服装模板图像对应的衣服关键点;根据脖子关键点和衣服关键点,计算服装模板图像中服装区域变形前后的横坐标映射矩阵;根据脖子关键点和衣服关键点,计算服装区域变形前后的纵坐标映射矩阵。
确定模块202,用于通过预设人脸关键点检测模型检测用户图像中的所有人脸关键点;根据用户图像对应的人脸关键点和预设标准人脸关键点,对用户图像进行人脸对齐;通过预先训练的脖子关键点检测模型从对齐后的用户图像中识别出脖子关键点。
确定模块202,用于根据服装模板图像中预标注的虚拟人脸关键点和预设标准人脸关键点,对服装模板图像进行对齐处理;根据服装模板图像中预标注的衣服关键点,从对齐处理后的服装模板图像中确定出对齐后的衣服关键点。
上述脖子关键点包括左右两侧脖子边界线与肩部相接处的两个关键点及锁骨区域位于脖子竖直中轴线上的一个关键点;衣服关键点包括领口左右两侧边界线的两个端点和所述左右两侧边界线的交点。
确定模块202,用于根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间;根据每个衣服关键点的横坐标,沿水平方向将服装模板图像的宽度划分为多段第二横坐标区间,第一横坐标区间的数目与第二横坐标区间的数目相等;根据多段第一横坐标区间和多段第二横坐标区间,利用线性插值和变形坐标映射函数计算服装模板图像中服装区域对应的横坐标映射矩阵。
确定模块202,用于根据脖子关键点和衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数;根据服装模板图像的高度、服装区域每个坐标点的纵坐标及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的纵坐标映射矩阵。
确定模块202,用于根据每个脖子关键点的横坐标,沿水平方向将用户图像的宽度划分为多段第一横坐标区间;根据服装模板图像的高度、脖子关键点和衣服关键点,分别计算每个衣服关键点的纵坐标对应的缩放系数;根据多段第一横坐标区间和每个衣服关键点的纵坐标对应的缩放系数,利用线性插值和变形坐标映射函数计算服装区域中每个横坐标对应的纵坐标的缩放系数。
确定模块202,还用于,在根据脖子关键点和衣服关键点,计算服装区域中每个横坐标对应的纵坐标的缩放系数之前,对服装模板图像中服装区域进行整体缩放处理,缩放后服装模板图像中领口边界线上纵坐标最大的关键点与用户图像中锁骨区域位于脖子竖直中轴线上的关键点重合;重新计算整体缩放处理后服装模板图像中的每个衣服关键点。
确定模块202,用于根据服装模板图像的高度、服装模板图像中领口左右两侧边界线的交点的纵坐标以及用户图像中锁骨区域位于脖子竖直中轴线上的脖子关键点的纵坐标,计算整体缩放系数;根据服装模板图像的高度、服装区域每个坐标点的纵坐标及整体缩放系数,利用变形坐标映射函数计算服装区域在整体缩放处理前后的纵坐标映射矩阵。
确定模块202,用于保持整体缩放处理后每个衣服关键点的横坐标不变;根据服装模板图像的高度、整体缩放系数及整体缩放处理前每个衣服关键点的纵坐标,分别计算整体缩放处理后每个衣服关键点的纵坐标。
确定模块202,用于根据服装模板图像的高度、整体缩放处理前后的纵坐标映射矩阵及每个纵坐标对应的缩放系数,利用变形坐标映射函数计算服装区域对应的最终的纵坐标映射矩阵。
变形模块203,用于根据坐标映射矩阵包括的横坐标映射矩阵,通过预设变形算法对服装模板图像中的服装区域进行水平方向的变形处理;根据坐标映射矩阵包括的纵坐标映射矩阵,通过预设变形算法对服装区域进行竖直方向的变形处理。
本申请的上述实施例提供的基于虚拟换装的服装变形装置与本申请实施例提供的基于虚拟换装的服装变形方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
本申请实施方式还提供一种电子设备,以执行上述基于虚拟换装的服装变形方法。请参考图7,其示出了本申请的一些实施方式所提供的一种电子设备的示意图。如图7所示,电子设备8包括:处理器800,存储器801,总线802和通信接口803,所述处理器800、通信接口803和存储器801通过总线802连接;所述存储器801中存储有可在所述处理器800上运行的计算机程序,所述处理器800运行所述计算机程序时执行本申请前述任一实施方式所提供的基于虚拟换装的服装变形方法。
其中,存储器801可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口803(可以是有线或者无线)实现该装置网元与至少一个其他网元之间的通信连接,可以使用互联网、广域网、本地网、城域网等。
总线802可以是ISA总线、PCI总线或EISA总线等。所述总线可以分为地址总线、数据总线、控制总线等。其中,存储器801用于存储程序,所述处理器800在接收到执行指令后,执行所述程序,前述本申请实施例任一实施方式揭示的所述基于虚拟换装的服装变形方法可以应用于处理器800中,或者由处理器800实现。
处理器800可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器800中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器800可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器801,处理器800读取存储器801中的信息,结合其硬件完成上述方法的步骤。
本申请实施例提供的电子设备与本申请实施例提供的基于虚拟换装的服装变形方法出于相同的发明构思,具有与其采用、运行或实现的方法相同的有益效果。
本申请实施方式还提供一种与前述实施方式所提供的基于虚拟换装的服装变形方法对应的计算机可读存储介质,请参考图8,其示出的计算机可读存储介质为光盘30,其上存储有计算机程序(即程序产品),所述计算机程序在被处理器运行时,会执行前述任意实施方式所提供的基于虚拟换装的服装变形方法。
需要说明的是,所述计算机可读存储介质的例子还可以包括,但不限于相变内存(PRAM)、静态随机存取存储器 (SRAM)、动态随机存取存储器 (DRAM)、其他类型的随机存取存储器 (RAM)、只读存储器 (ROM)、电可擦除可编程只读存储器 (EEPROM)、快闪记忆体或其他光学、磁性存储介质,在此不再一一赘述。
本申请的上述实施例提供的计算机可读存储介质与本申请实施例提供的基于虚拟换装的服装变形方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
需要说明的是:
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本申请的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本申请并帮助理解各个发明方面中的一个或多个,在上面对本申请的示例性实施例的描述中,本申请的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下示意图:即所要求保护的本申请要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本申请的单独实施例。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本申请的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
以上所述,仅为本申请较佳的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。