Python调用摄像头人脸识别,人工智能换脸python

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • chatgpt是什么?为什么这么火?
  • 如何看待马斯克等全球千名科技人士联名呼吁暂停更强大的AI开发?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • Tiamat人工智能绘画网站,Tiamat自动作图生成器,网址是多少?
  • 盗梦师人工智能绘画网站,盗梦师自动作图生成器,网址是多少?
  • 无界版图人工智能绘画网站,无界版图自动作图生成器,网址是多少?
  • 滴墨社区人工智能绘画网站,滴墨社区自动作图生成器,网址是多少?
  • draft.art官网网址是多少?Draft人工智能绘画网站,Draft art自动作图生成器
  • 6pen.art人工智能绘画网站,6pen.art自动作图生成器,网址是多少?
  • 文心一格人工智能绘画网站,文心一格自动作图生成器,网址是多少?
  • NovelAI人工智能绘画网站,NovelAI自动作图生成器,网址是多少?
  • Parti人工智能绘画网站,Parti自动作图生成器,网址是多少?
  • Disco Diffusion 人工智能绘画网站,Disco Diffusion 自动作图生成器,网址是多少?
  • 留言与评论(共有 条评论)
       
    验证码: