|
| 1 | +# encoding:utf-8 |
| 2 | +import requests |
| 3 | +import base64 |
| 4 | +import cv2 |
| 5 | + |
| 6 | +ak = 'ak' |
| 7 | +sk = 'sk' |
| 8 | + |
| 9 | +def getPhoto(): |
| 10 | + ''' |
| 11 | + 调用摄像头拍摄照片 |
| 12 | + :return: 照片路径 |
| 13 | + ''' |
| 14 | + print("准备拍摄照片,请保持颜值在线...") |
| 15 | + photoSrc = '自拍路径' |
| 16 | + cap = cv2.VideoCapture(0) |
| 17 | + while (1): |
| 18 | + ret, frame = cap.read() |
| 19 | + # 显示图像 |
| 20 | + cv2.imshow("photo", frame) |
| 21 | + # 按 q 键退出 |
| 22 | + if cv2.waitKey(1) & 0xFF == ord('q'): |
| 23 | + cv2.imwrite(photoSrc, frame) |
| 24 | + print("照片已经拍摄完成!") |
| 25 | + break |
| 26 | + cap.release() |
| 27 | + cv2.destroyAllWindows() |
| 28 | + return photoSrc |
| 29 | + |
| 30 | +def getAccessToken(): |
| 31 | + ''' |
| 32 | + 获取百度 AI 开放平台的 access_token |
| 33 | + :return: access_token |
| 34 | + ''' |
| 35 | + host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk |
| 36 | + response = requests.get(host) |
| 37 | + if response: |
| 38 | + print(response.json()) |
| 39 | + return response.json()['access_token'] |
| 40 | + |
| 41 | + |
| 42 | +def faceFusion(templateBase64, targetBase64, access_token): |
| 43 | + ''' |
| 44 | + 换脸术 |
| 45 | + :param templateBase64: 模板图片 |
| 46 | + :param targetBase64: 目标图片 |
| 47 | + :param access_token: access_token |
| 48 | + :return: 换脸后的 base64 |
| 49 | + ''' |
| 50 | + request_url = "https://aip.baidubce.com/rest/2.0/face/v1/merge" |
| 51 | + |
| 52 | + params = "{\"image_template\":{\"image\":\"" + templateBase64 + "\",\"image_type\":\"BASE64\",\"quality_control\":\"NONE\"},\"image_target\":{\"image\":\"" + targetBase64 + "\",\"image_type\":\"BASE64\",\"quality_control\":\"NONE\"}}" |
| 53 | + |
| 54 | + request_url = request_url + "?access_token=" + access_token |
| 55 | + headers = {'content-type': 'application/json'} |
| 56 | + response = requests.post(request_url, data=params, headers=headers) |
| 57 | + if response: |
| 58 | + print (response.json()) |
| 59 | + return response.json()['result']['merge_image'] |
| 60 | + |
| 61 | + |
| 62 | +def image2base64(imagePath): |
| 63 | + ''' |
| 64 | + 图片转base64 |
| 65 | + :param image_path: 图片地址 |
| 66 | + :return: base64 |
| 67 | + ''' |
| 68 | + with open(imagePath, 'rb') as f: |
| 69 | + base64_data = base64.b64encode(f.read()) |
| 70 | + s = base64_data.decode() |
| 71 | + return s |
| 72 | + |
| 73 | +def base642image(base64str): |
| 74 | + ''' |
| 75 | + base64转图片 |
| 76 | + :param base64str: base64 |
| 77 | + ''' |
| 78 | + imgdata = base64.b64decode(base64str) |
| 79 | + with open('换脸后路径', 'wb') as f: |
| 80 | + f.write(imgdata) |
| 81 | + print('successful') |
| 82 | + |
| 83 | +def main(): |
| 84 | + photoSrc = getPhoto() |
| 85 | + target = image2base64(photoSrc) |
| 86 | + template = image2base64('模板图片路径') |
| 87 | + print(target) |
| 88 | + access_token = getAccessToken() |
| 89 | + image_base64 = faceFusion(template, target, access_token) |
| 90 | + base642image(image_base64) |
| 91 | + |
| 92 | +if __name__ == '__main__': |
| 93 | + main() |
0 commit comments