Python调用摄像头人脸识别,人工智能换脸python
本文主要介绍如何使用Python和OpenCV实现摄像头的实时变脸效果。文章中的示例代码解释得很详细,感兴趣的朋友可以和边肖一起尝试一下。
00-1010环境和效果的基本原理完整源代码
目录
python3.9.6
pycharm 2021
图书馆环境:
dlib
opencv-python
视频效果如下:
视频波道
镜头实时变脸,老师都不认识我了!
环境与效果
使用dlib的shape _ predictor _ 68 _ face _ landmarks . dat模型得到一张正面人脸和相机自带的68个人脸特征点的图片(1.png)。
根据人脸特征点获取分别获取人脸面具。
仿射第一张图片,使其面部与相机图片中的面部对齐,以获得新的图片。
在面罩上执行相同的仿射操作。
把获得的两个人格的图形进行合并(其他地方不能空)
利用Opencv对上述两幅图像进行操作,对仿射变换后的A图像和摄像机图像进行泊松融合。
基本原理
# -*-编码: utf-8 -*-
导入cv2
导入dlib
将numpy作为np导入
detector=dlib . get _ frontier _ face _ detector()# DLIB的前向人脸检测器
predictor=dlib . shape _ predictor(r shape _ predictor _ 68 _ face _ landmarks . dat )# DLIB的人脸形状检测器
def get_image_size(image):
获取图片尺寸(高度、宽度)
:参数图像:图像
:return:(高度,宽度)
image_size=(image.shape[0],image.shape[1])
返回图像大小
def get_face_landmarks(图像、面部检测器、形状预测器):
获取面部标志,68个特征点
:参数图像:图像
: param face _ detector : dlib . get _ frontier _ face _ detector
: param shape _ predictor : dlib . shape _ predictor
3360返回3360np.array ([[],[]]),68个特征点
dets=face_detector(图像,1)
shape=shape_predictor(image,dets[0])
face_landmarks=np.array([[p.x,p.y] for p in shape.parts()])
返回地面_地标
def get_face_mask(image_size,face _ landmark):
获取面罩
3360 param image _ size 3360图像大小
3360参数面_界标3360 68特征点
3360返回3360 image _ mask,mask图片
mask=np.zeros(image_size,dtype=np.uint8)
points=NP . concatenate([face _ landmarks[0:16],face _ landmarks[26:17:-1]])
cv2.fillPoly(img=mask,pts=[points],color=255)
返回掩码
def get_affine_image(image1,image2,face_landmarks1,face_landmarks2):
得到图1的仿射变换图。
:参数图像1:图片1,要进行仿射变换的图片
:param image2:图片2,只要用来获取图片的大小,生成一个和它大小相同的仿射变换图片。
3360 param face _ landmarks 1:图片1的人脸特征点
:参数面_地标
2: 图片2的人脸特征点
:return: 仿射变换后的图片
"""
three_points_index = [18, 8, 25]
M = cv2.getAffineTransform(face_landmarks1[three_points_index].astype(np.float32),
face_landmarks2[three_points_index].astype(np.float32))
dsize = (image2.shape[1], image2.shape[0])
affine_image = cv2.warpAffine(image1, M, dsize)
return affine_image.astype(np.uint8)
def get_mask_center_point(image_mask):
"""
获取掩模的中心点坐标
:param image_mask: 掩模图片
:return: 掩模中心
"""
image_mask_index = np.argwhere(image_mask > 0)
miny, minx = np.min(image_mask_index, axis=0)
maxy, maxx = np.max(image_mask_index, axis=0)
center_point = ((maxx + minx) // 2, (maxy + miny) // 2)
return center_point
def get_mask_union(mask1, mask2):
"""
获取两个掩模掩盖部分的并集
:param mask1: mask_image, 掩模1
:param mask2: mask_image, 掩模2
:return: 两个掩模掩盖部分的并集
"""
mask = np.min([mask1, mask2], axis=0) # 掩盖部分并集
mask = ((cv2.blur(mask, (5, 5)) == 255) * 255).astype(np.uint8) # 缩小掩模大小
mask = cv2.blur(mask, (3, 3)).astype(np.uint8) # 模糊掩模
return mask
def skin_color_adjustment(im1, im2, mask=None):
"""
肤色调整
:param im1: 图片1
:param im2: 图片2
:param mask: 人脸 mask. 如果存在,使用人脸部分均值来求肤色变换系数;否则,使用高斯模糊来求肤色变换系数
:return: 根据图片2的颜色调整的图片1
"""
if mask is None:
im1_ksize = 55
im2_ksize = 55
im1_factor = cv2.GaussianBlur(im1, (im1_ksize, im1_ksize), 0).astype(np.float)
im2_factor = cv2.GaussianBlur(im2, (im2_ksize, im2_ksize), 0).astype(np.float)
else:
im1_face_image = cv2.bitwise_and(im1, im1, mask=mask)
im2_face_image = cv2.bitwise_and(im2, im2, mask=mask)
im1_factor = np.mean(im1_face_image, axis=(0, 1))
im2_factor = np.mean(im2_face_image, axis=(0, 1))
im1 = np.clip((im1.astype(np.float) * im2_factor / np.clip(im1_factor, 1e-6, None)), 0, 255).astype(np.uint8)
return im1
def main():
im1 = cv2.imread(1.png) # face_image
im1 = cv2.resize(im1, (600, im1.shape[0] * 600 // im1.shape[1]))
landmarks1 = get_face_landmarks(im1, detector, predictor) # 68_face_landmarks
if landmarks1 is None:
print({}:检测不到人脸.format(image_face_path))
exit(1)
im1_size = get_image_size(im1) # 脸图大小
im1_mask = get_face_mask(im1_size, landmarks1) # 脸图人脸掩模
cam = cv2.VideoCapture(0)
while True:
ret_val, im2 = cam.read() # camera_image
landmarks2 = get_face_landmarks(im2, detector, predictor) # 68_face_landmarks
if landmarks2 is not None:
im2_size = get_image_size(im2) # 摄像头图片大小
im2_mask = get_face_mask(im2_size, landmarks2) # 摄像头图片人脸掩模
affine_im1 = get_affine_image(im1, im2, landmarks1, landmarks2) # im1(脸图)仿射变换后的图片
affine_im1_mask = get_affine_image(im1_mask, im2, landmarks1, landmarks2) # im1(脸图)仿射变换后的图片的人脸掩模
union_mask = get_mask_union(im2_mask, affine_im1_mask) # 掩模合并
affine_im1 = skin_color_adjustment(affine_im1, im2, mask=union_mask) # 肤色调整
point = get_mask_center_point(affine_im1_mask) # im1(脸图)仿射变换后的图片的人脸掩模的中心点
seamless_im = cv2.seamlessClone(affine_im1, im2, mask=union_mask, p=point, flags=cv2.NORMAL_CLONE) # 进行泊松融合
cv2.imshow(seamless_im, seamless_im)
else:
cv2.imshow(seamless_im, im2)
if cv2.waitKey(1) == 27: # 按Esc退出
break
cv2.destroyAllWindows()
if __name__ == __main__:
main()
到此这篇关于Python实现摄像头实时换脸详解的文章就介绍到这了,更多相关Python实时换脸内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。