小游戏:换脸术
最近估计大家都陆陆续续的复工了,大家经常在节后会得一个叫做节后综合征的病,具体表现为:提不起精神、上班效率低、没精神,严重的还会出现恶心、焦虑、神经衰落等等。这里给大家带来一个小游戏娱乐一下,放松上班焦虑心情,叫做"换脸术",把自拍照变成沙雕图片。这时需要准备一张沙雕图片作为模板和一张为自拍照,自拍照脸部将替换沙雕图上的脸部。
思路与代码
这个小游戏整体思路包含了以下几个部分:
第一步:自拍照
这里使用到了 Python 的 opencv 模块,调用摄像头并拍照,使用 pip 安装一下
pip install opencv-contrib-python
安装完毕之后,将使用 opencv 模块调用摄像头拍照
import cv2
def getPhoto():
'''
调用摄像头拍摄照片
:return: 照片路径
'''
print("准备拍摄照片,请保持颜值在线...")
photoSrc = '自拍照路径'
cap = cv2.VideoCapture(0)
while (1):
ret, frame = cap.read()
# 显示图像
cv2.imshow("photo", frame)
# 按 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.imwrite(photoSrc, frame)
print("照片已经拍摄完成!")
break
cap.release()
cv2.destroyAllWindows()
return photoSrc
运行程序时出现如下错误:
qt.qpa.plugin: Could not find the Qt platform plugin "cocoa" in ""
还需要安装 opencv-python-headless 模块
pip install opencv-python-headless
第二步:将自拍照和沙雕图片变成 base64 格式的字符串
def image2base64(image_path):
'''
图片转base64
:param image_path: 图片地址
:return: base64
'''
with open(image_path, 'rb') as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode()
return s
第三步利用百度 ai 开放平台上传 base64 格式字符串
在这一步中需要用到百度 ai 开放平台,需要登录百度 ai 开放平台并创建应用得到 Api Key 和 Secret Key 请求得到一个 access_token,此 access_token 在 30天后失效需要重新请求
def getAccessToken():
'''
获取百度 ai 开放平台的 access_token
:return: access_token
'''
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk
response = requests.get(host)
if response:
print(response.json())
return response.json()['access_token']
最后将沙雕图的 base64 格式字符串和你的照片 base64 格式字符串加上 access_token 请求百度开放 API,返回得到融合人脸后的 base64 字符串
def faceFusion(templateBase64, targetBase64, access_token):
'''
换脸术
:param templateBase64: 模板图片
:param targetBase64: 目标图片
:param access_token: access_token
:return: 换脸后的 base64
'''
request_url = "https://aip.baidubce.com/rest/2.0/face/v1/merge"
params = "{\"image_template\":{\"image\":\"" + templateBase64 + "\",\"image_type\":\"BASE64\",\"quality_control\":\"NONE\"},\"image_target\":{\"image\":\"" + targetBase64 + "\",\"image_type\":\"BASE64\",\"quality_control\":\"NONE\"}}"
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print (response.json())
return response.json()['result']['merge_image']
参数介绍
image_template:模板照片 image_target:目标照片 image:图片的 base64 字符串 image_type:照片类型,有URL,base64,FACE_TOKEN人脸标识 quality_control:照片质量控制,有 NONE 不控制,LOW 低质量,NORMAL一般质量,HIGH 高质量
第四步通过百度开放平台返回的 base64 格式逆向生成图片
def base642image(base64str):
'''
base64转图片
:param base64str: base64
'''
imgdata = base64.b64decode(base64str)
with open('换脸后照片路径', 'wb') as f:
f.write(imgdata)
print('successful')
总结
本文主要使用 opencv 模块调用摄像头并拍摄和使用百度 ai 开放平台,这些功能只是其中的一小块,大家如果感兴趣可以试试其他有趣的功能。
示例代码:https://github.com/JustDoPython/python-100-day/tree/master/FusionFace