小游戏:换脸术

简介: 小游戏:换脸术

最近估计大家都陆陆续续的复工了,大家经常在节后会得一个叫做节后综合征的病,具体表现为:提不起精神、上班效率低、没精神,严重的还会出现恶心、焦虑、神经衰落等等。这里给大家带来一个小游戏娱乐一下,放松上班焦虑心情,叫做"换脸术",把自拍照变成沙雕图片。这时需要准备一张沙雕图片作为模板和一张为自拍照,自拍照脸部将替换沙雕图上的脸部。


image.png


思路与代码


这个小游戏整体思路包含了以下几个部分:



第一步:自拍照


这里使用到了 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天后失效需要重新请求


image.png











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 开放平台,这些功能只是其中的一小块,大家如果感兴趣可以试试其他有趣的功能。



目录
相关文章
|
6月前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
209 0
|
3月前
|
移动开发 JavaScript C#
总有一个是你想要的分享31个游戏源代码
该资源分享了31款游戏源代码,包括C#版植物大战僵尸、HTML5版五子棋等,均经过亲测可运行。下载链接中还包含13款游戏源码,适合游戏开发者和爱好者学习参考。作者辛苦整理,希望得到您的点赞与关注作为支持。
128 1
|
5月前
|
网络安全 Python
我不善言辞,但还是想教你做个没用的东西
一个可以禁用任意程序的上下行网络的小工具,有倒计时功能
|
7月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
200 0
|
存储 前端开发 JavaScript
你小子!过年了,写了一个拼图小游戏来拼掘金兔年礼盒,来玩玩不?
你小子!过年了,写了一个拼图小游戏来拼掘金兔年礼盒,来玩玩不?
209 2
|
开发者
你应该试着独自做个游戏
对于大部分从事游戏开发行业的人,其实并没有机会能够完整的去掌控一个游戏制作的全过程。开发的只负责开发工作,美术的只负责美术工作,大概只有策划能够有机会从整体上了解一个游戏,可能在很多公司中,对于策划也分为很多种,如果只是其中的一种策划,也是没有机会的,唯一一个能够从始至终掌控一个游戏的大概叫做总策划或者叫产品经理。
94 0
|
定位技术
你是否还记得有一款游戏叫做“魔塔”?(三)
你是否还记得有一款游戏叫做“魔塔”?
144 0
你是否还记得有一款游戏叫做“魔塔”?(三)
|
Python 内存技术
你是否还记得有一款游戏叫做“魔塔”?(一)
你是否还记得有一款游戏叫做“魔塔”?
411 0
你是否还记得有一款游戏叫做“魔塔”?(一)
|
JavaScript 前端开发
你是否还记得有一款游戏叫做“魔塔”?(二)
你是否还记得有一款游戏叫做“魔塔”?
125 0
下一篇
DataWorks