范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python摄像头换脸,现实版易容术重现江湖

  环境与效果python3.9.6 pycharm 2021
  库环境: dlib opencv-python
  视频图片效果如下:
  基本原理
  使用dlib的shape_predictor_68_face_landmarks.dat模型获取一张有正脸的图片(1.png)和摄像头的自己的68个人脸特征点。
  根据人脸特征点获取分别获取人脸掩模
  对第一个图片仿射变换使其脸部对准摄像头图片中的脸部得到新的图片
  对人脸掩模执行相同的操作仿射
  将两个性的得到图取并集(不能让别的地方空了)
  用opencv对两上面操作,对仿射变换后的a图片和摄像头图片进行泊松融合完整源码# -*- coding: utf-8 -*- import cv2 import dlib import numpy as np detector = dlib.get_frontal_face_detector() # dlib的正向人脸检测器 predictor = dlib.shape_predictor(r"shape_predictor_68_face_landmarks.dat") # dlib的人脸形状检测器 def get_image_size(image): """ 获取图片大小(高度,宽度) :param image: image :return: (高度,宽度) """ image_size = (image.shape[0], image.shape[1]) return image_size def get_face_landmarks(image, face_detector, shape_predictor): """ 获取人脸标志,68个特征点 :param image: image :param face_detector: dlib.get_frontal_face_detector :param shape_predictor: dlib.shape_predictor :return: np.array([[],[]]), 68个特征点 """ dets = face_detector(image, 1) shape = shape_predictor(image, dets[0]) face_landmarks = np.array([[p.x, p.y] for p in shape.parts()]) return face_landmarks def get_face_mask(image_size, face_landmarks): """ 获取人脸掩模 :param image_size: 图片大小 :param face_landmarks: 68个特征点 :return: image_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) return mask def get_affine_image(image1, image2, face_landmarks1, face_landmarks2): """ 获取图片1仿射变换后的图片 :param image1: 图片1, 要进行仿射变换的图片 :param image2: 图片2, 只要用来获取图片大小,生成与之大小相同的仿射变换图片 :param face_landmarks1: 图片1的人脸特征点 :param face_landmarks2: 图片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()
  完整项目文件私信回复"333",可直接分享

同庆建军佳节共叙鱼水深情翼联EDUP欢度八一建军节2021年8月1日,是中国人民解放军建军94周年纪念日。7月30日下午,翼联EDUP以同庆建军佳节共叙鱼水深情为主题,举办了热烈欢快的建军节活动。智力比拼建军知识竞答全体小伙伴认真有无WiWD9902无线投屏器趣意来袭打造一个家庭影院已变得愈加简单,使用无线投屏器,手机4K电影开启,电视同步播放,超清大屏更沉浸。至于举办一场游戏比赛就更加容易了。只需连接一台参赛手机,采用无线投屏器,将画面同屏到又省又快免装宽带翼联EDUP4G随身wifiD623S嗨翻今夏虽说如今的宽带已进入寻常百姓家,但作为打工人学生党,上网依然不是一件容易事。随身wifi已经出来好些年头了,好用易用动静相宜的随身wifi却是迷之存在。接下来,为大家介绍一款翼联E干杯翼联EDUP助威蜜雪冰城致敬火热青春7月26日下午,翼联EDUP开设了一个特别的下午茶环节,董事长王承先生为每一位小伙伴都奉上了一杯清凉的蜜雪冰城饮品,号召大家支持国货,向有责任有担当的民族品牌看齐,坚定理想不懈努力5个摄像头15颗雷达全新明锐PRO12。49万起售距离上海车展首发一周后,上汽大众斯柯达全新明锐PRO于5月17日正式上市。新车推出4款车型,售价区间为12。49万15。79万元。全新明锐PRO是斯柯达品牌旗下首款采用全新MQBE痛惜新能源车频繁自燃,再看比亚迪的安全底线01hr今年以来,多款新能源车频发自燃现象,伴随的剧烈的爆炸更让人心惊。消费者在感受着新能源车带来的新奇体验同时,也充斥着紧张与不安。安全再次战胜理性,成为关注新能源车的第一首选。榜单SUV保值率TOP5透露车越大越保值近日,中国汽车流通协会和精真估联合发布了最新的保值率数据及研究报告。报告显示,在SUV领域,级别越高的车型保值率越高,在二手市场价值更高,而小型SUV的保值率相对较低且下滑趋势明显奔驰电动化提速,2030年燃油车数量减少七成汽车电动化已不可逆,发明汽车的奔驰不再犹豫,开始了急行军。至2030年,电动车将占新车销量的半数以上,传统燃油车数量将减少七成。上周,奔驰面向全球投资者抛出一份未来计划,包括AMG转转大数据OPPOReno成为上半年最保值的旗舰机作为电子产品中最为普及的一种,手机可以说是最不保值的,用入手即贬值来形容可以说是非常贴切了。除了厂商频繁更新硬件迭代新品造成的原因外,来自官方的促销降价等手段更使得手机保值成为了难硬件技术升级,比亚迪汉首搭博世IPB制动系统比亚迪汉是中国首个搭载博世IPB智能集成制动系统的新能源量产车,同时基于IPB系统的CST舒适制动功能在汉上实现全球首发。IPB系统为汉实现领先的安全性舒适性和长续航提供了帮助。I小猛士变学霸局座张召忠国手刘国梁为风神AX7PRO站台以一场极限挑战真人秀的形式,东风风神AX7PRO于9月10日在线上市。著名军事评论家张召忠中国乒乓球协会主席刘国梁为新车硬核实力站台,见证栋梁本色。猛士压顶十秒钟移动堡垒更可靠备质
李瑞峰为魏建军打造新人设编辑导语随着魏牌摩卡DHTPHEV的发布,李瑞峰带领魏牌走上了高端新能源的新赛道。同时为补充营销短板,李瑞峰亲自下场直面用户,再开辟营销道路。怒怼造车新势力新势力和传统车企最主要差新车文懂车帝原创陈旭明长安C385官图发布懂车帝原创产品近日,长安汽车正式发布全新纯电动轿车代号C385官方图片,其车身长度达到4820毫米,轴距为2900毫米,拥有中型轿车的尺寸。另风洞实验,是通过放烟和布条来研究空气流动的?流言我们经常在汽车广告或纪录片里看到风洞的影像,都会拉烟或放布条,研究者通过观察它们来测定空气动力参数。真相这些只是为了便于观察,真正的玄机在风洞实验室的底板上。因为运动是相对的,人民时评充分激发数字医疗的优势人民时评充分激发数字医疗的优势财联社3月29日电,人民时评文章指出,目前,全国已有2200多家三级医院初步实现院内信息互通共享,7700多家公立医院提供互联网医疗服务,在线医疗用户Linux下CC手写一个线程池前言在我们日常生活中会遇到许许多多的问题,如果一个服务端要接受很多客户端的数据,该怎么办?多线程并发内存不够怎么办?所以我们需要了解线程池的相关知识。一线程池是什么?1。线程池的简闲鱼常见骗局大揭秘,1999的国行iphone12pro?面交就安全了?315全民行动本内容为作者原创,观点仅代表作者本人作者落尽红樱君不见本人七年玩机经验,在闲鱼摸爬滚打那么多年,几乎没翻过车,甚至还凭经验捡过几次小漏洞!!下面我将向大家讲解我的经验最大续航402公里,提供四驱版,一汽丰田纯电动bZ4X实车正式亮相近日,一汽丰田纯电动SUVbZ4X实车正式亮相,实际上该车已在去年广州车展首秀。新车在造型设计上更为激进。据悉,丰田bZ4X将分别由一汽丰田和广汽丰田国产,售价预计30万元左右,将为什么选择无耗材空气净化器?空气净化节能减排低碳生活现在的空气净化器市场技术层出不穷鱼龙混杂,从耗材的使用角度来说主要分两种,一种是有耗材(需要定期更换过滤单元),另一种是无耗材(过滤单元经过清洗后可反复使用比亚迪要对特斯拉下手了!纯电海豹或20万,搭载四驱续航700Km导读比亚迪要对特斯拉下手了!全新纯电海豹亮相,搭载四驱续航700Km比亚迪作为家喻户晓的国产品牌,旗下有着很多优秀的车型,而且早在十几年前就被众多消费者所接受,而且经典车型比亚迪F新能源车换电单打独斗困局亟待破解精品能源内容,点击右上角加关注比快充强多了。日前,在位于上海张江AI未来街区的蔚来第二代换电站,蔚来车主廖雨霏的整个换电流程耗时仅6分钟。近日发布的十四五现代能源体系规划提出,推进为什么美国不发展电商巨头?随着中国电商帝国的崛起,多少亿计的国民傻傻地引以为傲,好比一句小品说的话耗子给猫当三陪啊,被吃被玩还迷失其中而不自知,那么美国德国甚至科技大佬以色列为什么不会产生电商帝国哪?是网络