用Python玩人臉融合,想知道你將來孩子的長相?(附代碼)

在這裏插入圖片描述

此次花了點時間,將百度智能雲裏面的人臉識別功能與python結合,進行了一場實驗。結果仍是蠻有成就感的,過程也挺簡單,不會複雜,說不定,你就能融合出你孩子的長相了耶~ 下面咱們一塊兒敲起鍵盤吧!python

前期預備

百度AI開放平臺json

帳號註冊

用你的百度帳號登錄ai.baidu.com,百度AI開放平臺。app

而後建立一我的臉識別應用, 函數

你就會獲得API Key 和 Secret Key,這咱們等會代碼裏要用到,

由於每一個帳號的調用次數都是有限的,只能免費500次,且玩且珍惜。因此大家仍是本身申請的好。 post

讀接口開發文檔...

文檔地址:ai.baidu.com/docs#/Face-…測試

上面爲注意事項,就是post要帶header,圖片要是base64,還有請求地址等說明,文檔仍是要仔細看的,等下就會少點錯誤。編碼

上圖是說明你要post過去的數據,好比要template模板圖片和target目標文件兩張圖片,你也能夠設置圖片類型,圖片質量等url

上圖就是說你post過去後,會返回哪些東西的說明。spa

OK,看完了文檔,咱們來捋一下思路3d

思路

開始Coding...

一點點來開發,不要急於求成:

導入模塊

基於經驗,咱們確定要用到requests模塊,json模塊也要用,而後就是base64模塊,由於咱們要處理圖片。這些模塊咱們都有了,因此直接導入:
複製代碼
import requests ,json,base64
複製代碼

獲取Token

Token就是令牌,你要用接口須要取得它的承認,就是咱們要用到以前申請的那些key來獲取令牌:
複製代碼
def getToken():
	token = '24.4e27ea4786f90eb77f23c4d66a781f13.2592000.1575258466.282335-17676610'
	if token == '':
		client_id = 'hTN22uEIq9bQcBYL1tXvxTjL'
		client_secret = 'YiZ5PDW8Hoxka022loGdpoenNX53nCmq'
		host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id+'&client_secret=' + client_secret
		response = requests.get(host)
		token = response.json()["access_token"]
	return token
複製代碼

獲取圖片Base64

base64是圖片的一種格式,因此要先打開圖片,而後轉成base64編碼才能用
複製代碼
def readPic(name):
   with open("D:\\用戶目錄\\Desktop\\face\\"+name, 'rb') as f:
       base64_data = base64.b64encode(f.read())
       s = base64_data.decode()
       return s
複製代碼

保存base到本機

由於文檔裏面告訴咱們,返回的圖片是base64,因此這裏咱們還要把base64轉成你能夠看到的圖片。因此:

def downPic(data):
   imagedata = base64.b64decode(data)
   file = open('D:\\用戶目錄\\Desktop\\face\\done.jpg',"wb")
   file.write(imagedata)
複製代碼

注意:代碼文件也放在這個文件夾裏面。

圖片融合

接下來就是最主要的功能了,
複製代碼
def merge(template,target):
   token = getToken()
   url = 'https://aip.baidubce.com/rest/2.0/face/v1/merge'
   request_url = url + '?access_token=' + token
   params={
   	"image_template":{
   		"image":template,
   		"image_type":"BASE64",
   		"quality_control":"NORMAL"
   	},
   	"image_target":{
   		"image":target,
   		"image_type":"BASE64",
   		"quality_control":"NORMAL"
   	},
   	"merge_degree":"HIGH"
   }
   params=json.dumps(params)
   headers = {'content-type': 'application/json'}
   result = requests.post(request_url, data=params, headers=headers).json()
   if result['error_code'] == 0:
   	res = result["result"]["merge_image"]
   	downPic(res)
   	print('Done !')
   else:
   	print(str(result['error_code'])+result['error_msg'])
複製代碼

功能測試

在開始調試時,要一點點來測試,否則你那500次調用次數根本不夠你用,等你代碼寫好了,對不起,你的次數用完了,以下圖,你還玩個蛋蛋呀!

#功能測試
#測試獲取Token
print(getToken())

#測試讀取圖片base64
print(readPic('1.jpg'))
print(readPic('2.png'))

#測試下載圖片函數
img = readPic('1.jpg')
downPic(img)
複製代碼

下面是我電腦文件夾,注意圖片的格式

而後寫幾行代碼,而後運行一下

#主程序
img1 =	readPic('2.jpeg')
img2 =	readPic('1.jpg')
merge(img1,img2)
複製代碼

出現Done!說明代碼成功了!咱們打開文件夾看看有沒有「done.jpg」這張圖

python完整代碼

請發送【源碼】,今天文件名爲「face.zip」。

↓ ↓ ↓ 加小哥哥一塊兒玩耍吧 ↓ ↓ ↓

相關文章
相關標籤/搜索