使用OpenCV+Dlib操作人脸-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
这是一个关于如何使用OpenCV和DLIB在图像上应用虚拟口红的快速教程。同样的原则也可以扩展到其他面部特征,例如某人的眼睛.鼻子.下巴。为了获得上图所示的结果,我们需要执行以下一系列步骤:检测面部标志使用由嘴部标志组成的凸多边形来创建面罩使用形态学操作来增强面罩并使其模糊以获得更好的混合效果隔离嘴唇和脸对嘴唇应用颜涩变换将嘴唇和脸放在一起首先,我们需要检测人脸的面部特征。库Dlib提供了一种方便的方法来实现这一点;但是,请记住,对象的脸需要面对相机。如果头部姿势不正确,测试结果将很差。
在这个例子中,我们只对嘴唇的点感兴趣。下图显示了Dlib返回的面部地标索引。如你所见,我们对48到60点(嘴唇的外部”轮廓”)感兴趣。
使用这些点,我们可以制作一个面具,让我们可以在不影响面部整体外观的情况下处理嘴唇的颜涩。但等一下。在我们开始使用这些颜涩之前,我们需要改进面罩。在本例中,使用4×4矩形核的形态闭合操作就足够了。请注意下面的图像,它填充了cv2生成的原始多边形右上角的一个间隙。右:用lips/Left:polygon在关闭操作后创建的凸多边形
对于自然效果,我们还需要一个模糊遮罩。模糊遮罩将产生更好的混合效果。我们将cv2.GaussianBlur应用于遮罩。最后,我们反转面罩(我们需要两个,一个用于嘴唇,另一个用于面部)。右:模糊遮罩/左:模糊反转遮罩
我们将通过将这些掩码从0–255(uint8)转换为0–1(float)范围,然后将其与图像相乘来应用这些掩码。右下角的图像是原始图像乘以反转掩模。左边的图像是原始图像上的颜涩变换乘以蒙版的结果。颜涩变换由cv2.applyColorMap(im,cv2.COLORMAP_INFERNO)给出。右:原始图像和反向模糊遮罩的位与运算/左:颜涩变换图像和模糊遮罩位与运算
现在,剩下的就是添加这两个图像。右:原始图像/左:结果图像
这是密码。
导入cv2
导入dlib
导入faceBlendCommon作为面
将numpy导入为np
#加载图像
im=cv2.imread(“cv2/女孩-无-化妆.jpg”)
#检测面部关键点
PREDICTOR_PATH=r”C:用户elipe.cunhDocuments envcv2week1-pytondatmodelshape_PREDICTOR_68_face_landmarks.dat”
faceDetector=dlib.get_front_face_detector()
landmarkDetector=dlib.shape_预测器(预测器_路径)
landmarks=face.getLandmarks(faceDetector.landmarkDetector,im)
#为你的嘴唇做个口罩
lipsPoints=地标[48:60]
掩码=np.零((im.shape[0],im.shape[1],3),dtype=np.float32)
cv2.fillConvexPoly(掩码,np.int32(lipsPoints),(1.0,1.0,1.0))
掩码=255*np.uint8(掩码)
#应用闭合操作以改善面罩
内核=cv2.getStructuringElement(cv2.MORPH_RECT,(40,40))
mask=cv2.morphologyEx(掩码,cv2.MORPH_CLOSE,内核,1)
#自然效果的模糊遮罩
掩码=cv2.高斯模糊(掩码,(15,15),cv2.边界_默认)
#计算反向掩码
inverseMask=cv2.位_不(掩码)
#将掩码转换为浮点以进行混合
mask=mask.astype(float)/255
inverseMask=inverseMask.astype(float)/255
#将颜涩贴图应用于嘴唇
嘴唇=cv2.applyColorMap(im,cv2.COLORMAP_INFERNO)
#将嘴唇和脸转换为0-1范围
lips=lips.astype(float)/255
ladyFace=im.astype(浮点数)/255
#用面膜调整嘴唇和面部
justLips=cv2.乘法(口罩,嘴唇)
justFace=cv2.乘法(inverseMask,ladyFace)
#添加面部和嘴唇
结果=justFace+justLips
#显示结果
cv2.imshow(“”,结果)
cv2.waitKey(0)
600学习网 » 使用OpenCV+Dlib操作人脸-600学习网