python—呼叫API人臉識別

Como0413發表於2019-03-01

#-*- coding: utf-8 -*-
import urllib.request
import urllib.error
import time
import re
#json 互動協議
import json
import cv2 as cv
import numpy as np

http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
key = 建立的API key的API key
secret = 建立的API key的API Secret
#影像地址
path_name = 影像地址
filepath = r''+path_name

#將時間變成十六進位制
boundary = '----------%s' #% hex(int(time.time() * 1000))
data = []
#boundary邊界
data.append('--%s' % boundary)
#許可權名新增
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_key')
data.append(key)
#許可權密碼新增
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_secret')
data.append(secret)
data.append('--%s' % boundary)
#二進位制方法讀取  'rb
fr = open(filepath, 'rb')
#傳輸資料到網頁
data.append('Content-Disposition: form-data; name="%s"; filename=" "' % 'image_file')
data.append('Content-Type: %s\r\n' % 'application/octet-stream')
data.append(fr.read())
#關閉傳輸通道
fr.close()
data.append('--%s' % boundary)
#return_landmark    是否檢測並返回人臉關鍵點
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'return_landmark')
'''
0   不檢測
1  檢測,返回 83 個人臉關鍵點
2   檢測,返回 106 個人臉關鍵點
'''
data.append('1')
data.append('--%s' % boundary)
#return_attributes  是否檢測並返回根據人臉特徵判斷出的年齡、性別、情緒等屬性
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'return_attributes')
data.append(
    "gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus")
data.append('--%s--\r\n' % boundary)

#改變編碼格式
for i, d in enumerate(data):
    if isinstance(d, str):
        data[i] = d.encode('utf-8')

http_body = b'\r\n'.join(data)

# 生成HTTP請求
req = urllib.request.Request(url=http_url, data=http_body)

# header
req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)

try:
    # 將資料釋出到伺服器
    resp = urllib.request.urlopen(req, timeout=5)
    #得到響應
    qrcont = resp.read()
    # 如果你想載入為JSON,你應該先解碼
    # for example: json.loads(qrcont.decode('utf-8'))
    qrcont = qrcont.decode('utf-8')
    #將字串解碼變成字典
    qrcont =json.loads(qrcont)
    # print(qrcont)
    cv.namedWindow('img',cv.WINDOW_NORMAL)

    '''

     不帶中文路徑的影像

      img = cv.imread(path)

    '''

   #讀取帶中文路徑的影像
    img = cv.imdecode(np.fromfile(path_name,dtype=np.uint8),1)
    # 圖上新增文字
    font = cv.FONT_HERSHEY_SIMPLEX
    for i in range(len(qrcont['faces'])):
        dis = qrcont['faces'][i]['face_rectangle']

        #木有購買API的使用許可權,所以只能顯示前五個識別出來的年齡等
        if i < 5:
            age = qrcont['faces'][i]['attributes']['age']

           #影像上新增文字
            cv.putText(img, str(age['value']), (dis['left'], dis['top']), font, 4, (98,170,255), 2)

        #畫矩形框
        cv.rectangle(img, (dis['left'], dis['top']), (dis['left']+dis['width'], dis['top']+dis['height']), (255, 255, 119), 3)
    cv.imshow('img',img)
    cv.waitKey(0)
except urllib.error.HTTPError as e:
    print(e.read().decode('utf-8'))

相關文章