一、换脸

1、调用API

import requests   #导入requests库
import base64    #导入base64库
from PIL import Image
import matplotlib.pyplot as plt# API_Key='wLXiL5dy2qrO6YErbUm9dF_kr4wP7EVc'
# API_Secret  = 'iEFrwgEzU_cIyrvMOSOw_vGUjNttgLhs'
#借助https://console.faceplusplus.com.cn平台来实现换脸
API_Key = 'CGj6vYsWyRnKPPfvJNNIuSujuVVyJ095'    #你自己申请的API Key
API_Secret = '7QMUgWN7CA8QlAdfDdNnQnNJX4fnZlu7'   ##你自己申请的API Secret# 定义一个获取图片的人脸特征参数的函数
def find_face(imgpath):    #查找人脸参数(图片位置)url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'    #使用的人脸识别网站data = {'api_key': API_Key, 'api_secret': API_Secret, 'image_url': imgpath, 'return_landmark': 1}    #相关个人账号参数等files = {'image_file': open(imgpath, 'rb')}    #打开图片response = requests.post(url, data=data, files=files)    #用requests.poet()函数将个人账号参数和图片发送到网站res_json = response.json()    #转换为jsonfaces = res_json['faces'][0]['face_rectangle']  # 获取面部大小的四个值,分别为长宽高低{'width': 176, 'top': 128, 'left': 80, 'height': 176}return faces    #返回图片的面部参数# 定义一个换脸函数,函数中number表示两张脸的相似度为99%
def change_face(image_1, image_2, number=99):url = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"    #使用的换脸网址find_p1 = find_face(image_1)    #第1张图片的人脸参数find_p2 = find_face(image_2)    #第2张图片的人脸参数rectangle1 = str(str(find_p1['top']) + ',' + str(find_p1['left']) + ',' + str(find_p1['width']) + ',' + str(find_p1['height']))  # 得到图片1坐标rectangle2 = str(str(find_p2['top']) + ',' + str(find_p2['left']) + ',' + str(find_p2['width']) + ',' + str(find_p2['height']))  # 得到图片2坐标page1 = open(image_1, 'rb')  #以二进制打开图片1page1_64 = base64.b64encode(page1.read())  #将字符串转成成base64编码page1.close()  #关闭图片1page2 = open(image_2, 'rb')   #二进制打开图片2page2_64 = base64.b64encode(page2.read())    #将字符串转成成base64编码page2.close()   #关闭图片2data = {'api_key': API_Key, 'api_secret': API_Secret, 'template_base64': page1_64,'template_rectangle': rectangle1, 'merge_base64': page2_64, 'merge_rectangele': rectangle2,'merge_rate': number}    #参数信息response = requests.post(url, data=data).json()    #发送参数到换脸网站results = response['result']    #得到返回参数image = base64.b64decode(results)    #转换信息with open('新图片.jpg', 'wb') as file:    #将信息写入到图片file.write(image)print("转换完成了!")if __name__ == '__main__':change_face('zhixuan.jpg','zipai.jpg')img1=plt.imread('zhixuan.jpg')
plt.axis('off')
plt.imshow(img1)
plt.show()
img2=plt.imread('zipai.jpg')
plt.axis('off')
plt.imshow(img2)
plt.show()
img0=Image.open('新图片.jpg')
plt.axis('off')
plt.imshow(img0)
plt.show()

运行结果:

2、识别五官一一替换

import cv2
import dlib
import numpy
import sys
from PIL import Imagefilelist=os.listdir(os.getcwd())
for infile in filelist:filename=str(infile)isimg=filename.find('.jfif')if isimg>=0:outfile=infile[0:isimg]+".jpg"if infile!=outfile:try:Image.open(infile).save(outfile)except IOError:print("Cannot convert",infile)sys.argv = ["faceswap.py","zhuyilong.jpg","zipai.jpg"]
PREDICTOR_PATH = r"face_recognition_models\models\shape_predictor_68_face_landmarks.dat"
SCALE_FACTOR = 1
FEATHER_AMOUNT = 11FACE_POINTS = list(range(17, 68))
MOUTH_POINTS = list(range(48, 61))
RIGHT_BROW_POINTS = list(range(17, 22))
LEFT_BROW_POINTS = list(range(22, 27))
RIGHT_EYE_POINTS = list(range(36, 42))
LEFT_EYE_POINTS = list(range(42, 48))
NOSE_POINTS = list(range(27, 35))
JAW_POINTS = list(range(0, 17))
ALIGN_POINTS = (LEFT_BROW_POINTS + RIGHT_EYE_POINTS + LEFT_EYE_POINTS +RIGHT_BROW_POINTS + NOSE_POINTS + MOUTH_POINTS)OVERLAY_POINTS = [LEFT_EYE_POINTS + RIGHT_EYE_POINTS + LEFT_BROW_POINTS + RIGHT_BROW_POINTS,NOSE_POINTS + MOUTH_POINTS,
]COLOUR_CORRECT_BLUR_FRAC = 0.6detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(PREDICTOR_PATH)class TooManyFaces(Exception):passclass NoFaces(Exception):passdef get_landmarks(im):rects = detector(im, 1)if len(rects) > 1:raise TooManyFacesif len(rects) == 0:raise NoFacesreturn numpy.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])def annotate_landmarks(im, landmarks):im = im.copy()for idx, point in enumerate(landmarks):pos = (point[0, 0], point[0, 1])cv2.putText(im, str(idx), pos,fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,fontScale=0.4,color=(0, 0, 255))cv2.circle(im, pos, 3, color=(0, 255, 255))return imdef draw_convex_hull(im, points, color):points = cv2.convexHull(points)cv2.fillConvexPoly(im, points, color=color)def get_face_mask(im, landmarks):im = numpy.zeros(im.shape[:2], dtype=numpy.float64)for group in OVERLAY_POINTS:draw_convex_hull(im,landmarks[group],color=1)im = numpy.array([im, im, im]).transpose((1, 2, 0))im = (cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT), 0) > 0) * 1.0im = cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT), 0)return imdef transformation_from_points(points1, points2):points1 = points1.astype(numpy.float64)points2 = points2.astype(numpy.float64)c1 = numpy.mean(points1, axis=0)c2 = numpy.mean(points2, axis=0)points1 -= c1points2 -= c2s1 = numpy.std(points1)s2 = numpy.std(points2)points1 /= s1points2 /= s2U, S, Vt = numpy.linalg.svd(points1.T * points2)R = (U * Vt).Treturn numpy.vstack([numpy.hstack(((s2 / s1) * R,c2.T - (s2 / s1) * R * c1.T)),numpy.matrix([0., 0., 1.])])def read_im_and_landmarks(fname):im = cv2.imread(fname, cv2.IMREAD_COLOR)im = cv2.resize(im, (im.shape[1] * SCALE_FACTOR,im.shape[0] * SCALE_FACTOR))s = get_landmarks(im)return im, sdef warp_im(im, M, dshape):output_im = numpy.zeros(dshape, dtype=im.dtype)cv2.warpAffine(im,M[:2],(dshape[1], dshape[0]),dst=output_im,borderMode=cv2.BORDER_TRANSPARENT,flags=cv2.WARP_INVERSE_MAP)return output_imdef correct_colours(im1, im2, landmarks1):blur_amount = COLOUR_CORRECT_BLUR_FRAC * numpy.linalg.norm(numpy.mean(landmarks1[LEFT_EYE_POINTS], axis=0) -numpy.mean(landmarks1[RIGHT_EYE_POINTS], axis=0))blur_amount = int(blur_amount)if blur_amount % 2 == 0:blur_amount += 1im1_blur = cv2.GaussianBlur(im1, (blur_amount, blur_amount), 0)im2_blur = cv2.GaussianBlur(im2, (blur_amount, blur_amount), 0)# Avoid divide-by-zero errors.im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype)return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) /im2_blur.astype(numpy.float64))im1, landmarks1 = read_im_and_landmarks(sys.argv[1])
im2, landmarks2 = read_im_and_landmarks(sys.argv[2])M = transformation_from_points(landmarks1[ALIGN_POINTS],landmarks2[ALIGN_POINTS])mask = get_face_mask(im2, landmarks2)
warped_mask = warp_im(mask, M, im1.shape)
combined_mask = numpy.max([get_face_mask(im1, landmarks1), warped_mask],axis=0)warped_im2 = warp_im(im2, M, im1.shape)
warped_corrected_im2 = correct_colours(im1, warped_im2, landmarks1)output_im = im1 * (1.0 - combined_mask) + warped_corrected_im2 * combined_mask  #应用遮罩cv2.imwrite('output2.jpg', output_im)

相比较而言,API的效果更加自然。

二、熊猫头表情包

1、方法概述:

(1)使用face_recognition.face_landmarks()获取人脸面部信息,并在人脸上描绘出来

(2)新建原图大小的空白图片,用imageDraw在上面勾勒人脸轮廓

(3)使用cv2重新读入原图,使用膨胀腐蚀来消除噪声、强化表情,截取表情

(4)使用paste函数将表情贴入背景图

(5)对图片进行二值化处理,输出表情包

2、完整代码

import face_recognition
import numpy as np
import cv2
from PIL import Image, ImageDraw, ImageFontface_line = list()#用于记录脸部轮廓信息,之后做掩膜要用
image = face_recognition.load_image_file("hp.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
#打印此图像中眉毛和脸型组成的轮廓
for face_landmarks in face_landmarks_list:facial_features = ['chin','left_eyebrow','right_eyebrow']for facial_feature in facial_features:print("{} points: {}".format(facial_feature, face_landmarks[facial_feature]))#图像中描绘出每个人脸特征pil_image = Image.fromarray(image)d = ImageDraw.Draw(pil_image)chin = face_landmarks['chin']left_eyebrow = face_landmarks['left_eyebrow']right_eyebrow = face_landmarks['right_eyebrow']chin.reverse()list_all = left_eyebrow + right_eyebrow + chin + [left_eyebrow[0]]face_line.append(list_all)d.line(list_all, width=5)pil_image.save("Facial_contour.jpg")#新建一个和原图一样大小的全白图片,用ImageDraw在上面勾出人脸轮廓,作为掩膜的模板
mask = np.ones(image.shape, dtype=np.uint8)*255
mask = Image.fromarray(mask)
q = ImageDraw.Draw(mask)
q.line(face_line[0], width=5, fill=(0, 0, 0))
mask.save("mask.jpg")#将图片写出,交给OpenCV处理
#生成掩膜
mask = cv2.imread('mask.jpg')
h, w = mask.shape[:2]  #读取图像的宽和高
mask_flood = np.zeros([h + 2, w + 2], np.uint8)  #新建图像矩阵(+2是官方函数要求)
cv2.floodFill(mask, mask_flood, (75, 75), (0, 0, 0))#使用OpenCV的水漫填充,把轮廓外部涂成黑色,内部为白色
kernel = np.ones((2, 2), np.uint8)#用一个2*2的卷积核对掩膜进行闭运算,去掉噪声
erosion = cv2.erode(mask, kernel, iterations=1)
dilation = cv2.dilate(erosion, kernel, iterations=1)
mask = dilation#重新读入原图,框出RIO,交给OpenCV处理
image = cv2.imread("hp.jpg")
image[mask == 0] = 0
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#将处理过的图片变为灰度图
ret, image = cv2.threshold(GrayImage, 80, 255, cv2.THRESH_BINARY)#二值化处理
#再来一次水漫填充,把轮廓之外的地方变成白色
h, w = image.shape[:2]
mask_flood = np.zeros([h + 2, w + 2], np.uint8)
cv2.floodFill(image, mask_flood, (1, 1), (255, 255, 255))
#输入表情需要截取的部分,不同图的参数不同
image = image[140:250, 90:230]
cv2.imwrite("last.png",image)#输出图片,给Image做处理box = (100, 100, 300, 250)#背景图要被替换的部分
base_img = Image.open('background.jpg')
image = Image.open('last.png')
image = image.resize((box[2] - box[0], box[3] - box[1]))#缩放表情,贴入的表情必须和背景被替换的地方大小相同
base_img.paste(image, box)
base_img.show()
base_img.save('out.png')#输出图片,给cv2做处理#对图片再进行一次二值化处理
image = cv2.imread(r'out.png')
GrayImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,image = cv2.threshold(GrayImage,85,255,cv2.THRESH_BINARY)
cv2.imwrite("last_out.jpg", image)
cv2.waitKey(0)

3、运行结果:

Python作业小组成员:车雨萌,郑芷萱

人脸识别(3)——换脸+熊猫头表情包应用相关推荐

  1. python实现人脸识别抓取人脸并做成熊猫头表情包(2)之优化

    上次做完python实现人脸识别抓取人脸并做成熊猫头表情包之后就放了一下,因为还要好好学习Springboot毕竟这才是找工作的硬实力.但是优化这个代码心里面一直很想,借用<clean code ...

  2. 好玩的熊猫头表情包图片生成PHP源码+实测可用

    正文: 好玩的熊猫头表情包图片生成PHP源码+实测可用,非常好玩的一个源码,实测搭建没问题,可以一键生成各式各样的表情包,还可以自己输入底部表情包文字啥的. 程序: wwurgs.lanzouv.co ...

  3. python实现人脸识别抓取人脸并做成熊猫头表情包

    前几天在浏览器上看到推送的文章用人脸识别做表情包.当时并不为意,没过多久就想弄一下了.无奈浏览器开了无痕找不着历史记录,上网搜也搜不到.CSDN里有过半都是简单地把两张图拼一起(你别说,经过我这么一找 ...

  4. python 换脸 github_人脸识别和换脸相关深度学习开源项目github汇总

    openface github:https://github.com/cmusatyalab/openface openface是一个基于深度神经网络的开源人脸识别系统.该系统基于谷歌的文章<F ...

  5. 人脸识别技术介绍和表情识别最新研究

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 一.人脸识别技术介绍 人脸识别作为一种生物特征识别技术,具有非侵扰性.非接触性.友好性和便捷性等优点 ...

  6. 人脸识别最新数据库(表情)汇总

    人脸表情识别就是让计算机识别人脸的各种表情,进而分析表情所代表的情绪,意图等.人脸表情识别可以用在测谎,医学辅助诊断,人机交互方面. 与人脸识别相比,人脸表情特征更加细微,而且受各种因素的干扰也更大. ...

  7. 不用PS,一键生成熊猫头表情包(二)

    摘要 技术栈如下: 代码演示:python 面部关键点识别:dlib 图像处理:pillow,opencv 环境的配置,可自行查找.尤其是dlib的安装,具体安装过程我也忘记了. 说明:代码演示不是完 ...

  8. 不用PS,一键生成熊猫头表情包

    效果展示 以杨洋的图片为例(图文来源网络,如有侵权请联系删除) 总体效果还行,主要是因为原始图片中,人脸与周围环境对比明显,人脸眉毛.眼睛.鼻子.嘴巴.轮廓没有遮挡. 再放几张处理结果: 眉毛部分被头 ...

  9. Photoshop系列_04DIY熊猫头表情包

    最终效果: 文章目录 一.导入图片 二.抠出人像 三.阈值调整 一.导入图片 原始图片: 接着将人像素材拖入PS当中,调整好大小之后敲回车键: 二.抠出人像 使用套索工具将脸部抠出: 接着按:CTRL ...

最新文章

  1. 干掉 Postman?测试接口直接生成API文档,这个文档工具真香!
  2. 昔日的独角兽Docker资金紧张,未来前途未卜
  3. Linux之CentOS安装composer与git
  4. Gradle语法基础解析
  5. HDU - 4348 To the moon(主席树区间更新-标记永久化)
  6. ui自动化测试测试报告_您需要了解的有关UI测试的所有信息
  7. NILMTK——深扒组合优化(CO)和FHMM细节
  8. ZZULIOJ 1067:有问题的里程表
  9. 【报告分享】2020社交电商消费者购物行为研究报告:传统与创新进入融合时代.pdf(附下载链接)...
  10. Zabbix网络设备常用的SNMP OID
  11. JQUERY右侧悬浮返回顶部代码
  12. mysql sjis 校对乱码_数据库乱码问题解决剖析
  13. oracle删除闪回文件,oracle的闪回查询,闪回删除:
  14. 小米手机fastboot模式出现Press any key to shutdown字样解决方法
  15. 美通社企业新闻汇总 | 2019.1.23 | 上海迪士尼建疯狂动物城园区;戴森运营总部移至新加坡...
  16. 北京理工大学 计算机考研真题,北京理工大学考研真题汇总
  17. 用Look'n'Stop防火墙实现ARP终极防御
  18. 常用软件开发模型的介绍
  19. 玩转ChatGPT:Auto-GPT项目部署与测评
  20. 【博学谷学习记录】超强总结,用心分享丨大数据超神之路(五):Hadooop基础篇

热门文章

  1. 【SA系列】解决方案架构师专家岗位招聘参考标准
  2. 都挺好!当老年人遇上互联网......
  3. arduino UNO通过AT指令控制esp8266连接WiFi及onenet云平台
  4. 2022年买哪个蓝牙耳机好?20款全球热门蓝牙耳机排行榜
  5. 深度学习——综述(LeCun、Bengio和Hinton)
  6. 内温的整体优先效应实验_熔盐电解制备钨铜合金粉体槽内温场条件分析
  7. 高通低功耗蓝牙音频芯片处理器-QCC3026
  8. PointNet学习笔记(二)——支撑材料(理论证明)
  9. 搭建HTTPS从域名申请、SSL证书申请、Nginx配置等一步步玩起来。
  10. OSS文件上传(页面直传)