本文阐述了调用face++ API的方法,及把接收到的特征点绘制在图片上的方法。
# -*- coding: utf-8 -*- """ Created on Tue Apr 17 17:39:08 2018 @author: DSY """ import cv2 import requests import json url = 'https://api-cn.faceplusplus.com/facepp/v3/detect' files = {'image_file':open('your-image-address', 'rb')} payload = {'api_key': 'your-api-key', 'api_secret':'your-api-secret', 'return_landmark': 2, 'return_attributes':'none'} r = requests.post(url,files=files,data=payload) data=json.loads(r.text) #%% #print request content,you can also use r.+tab to see more things. #print(r.text) width = data['faces'][0]['face_rectangle']['width'] top = data['faces'][0]['face_rectangle']['top'] height = data['faces'][0]['face_rectangle']['height'] left = data['faces'][0]['face_rectangle']['left'] img = cv2.imread("E:\\3Dface\\3D\\obj\\TL2807.bmp") vis = img.copy() #draw face rectangle #cv2.rectangle(vis, (left, top), (left+width, top+height),(0, 255, 0), 1) #%% #draw face landmarks for j in (0,len(data['faces'])-1): for i in data['faces'][j]['landmark']: cor=data['faces'][j]['landmark'][i] x=cor["x"] y=cor["y"] cv2.circle(vis, (x,y), 2, (0,255,0),-1) #%% cv2.imshow("Image", vis) cv2.waitKey(0) #save image with landmarks cv2.imwrite("file-save-address",vis) cv2.destroyAllWindows()
上述是总的程序,下面分块展开。
1、访问API并接收API的数据,存到变量data(r.text)中。变量类型为一个dict。可以自己print看具体。具体API的参数可以访问face++的网页,在payload里添加或删除。值得一提的是return_landmark中可以选择0,1,2。0是无landmark,1是83个,2是103个。
import cv2 import requests import json url = 'https://api-cn.faceplusplus.com/facepp/v3/detect' files = {'image_file':open('your-image-address', 'rb')} payload = {'api_key': 'your-api-key', 'api_secret':'your-api-secret', 'return_landmark': 2, 'return_attributes':'none'} r = requests.post(url,files=files,data=payload) data=json.loads(r.text)
2、通过遍历字典,用opencv来在在图上进行绘画。opencv的基本操作。前半部分绘制人脸框,后半部分遍历点,并绘制,对于多张人脸,也都能画上。
width = data['faces'][0]['face_rectangle']['width'] top = data['faces'][0]['face_rectangle']['top'] height = data['faces'][0]['face_rectangle']['height'] left = data['faces'][0]['face_rectangle']['left'] img = cv2.imread("E:\\3Dface\\3D\\obj\\TL2807.bmp") vis = img.copy() #draw face rectangle #cv2.rectangle(vis, (left, top), (left+width, top+height),(0, 255, 0), 1) #%% #draw face landmarks for j in (0,len(data['faces'])-1): for i in data['faces'][j]['landmark']: cor=data['faces'][j]['landmark'][i] x=cor["x"] y=cor["y"] cv2.circle(vis, (x,y), 2, (0,255,0),-1) #%% cv2.imshow("Image", vis) cv2.waitKey(0) #save image with landmarks cv2.imwrite("file-save-address",vis) cv2.destroyAllWindows()