前言
前两天在网上看到了一篇博客,觉得挺好玩的,自己对于人脸识别这一块有点兴趣,因此进行了解,整理如下。
之前看到这篇文章,进行实现了一下。文章里面是在windows下进行的,我在ubuntu16.04里面进行验证了一下。我的python 版本为3.5,模块:opencv(需要手动安装),requests(用于接口请求)。本文代码和原来的代码大体上一样。
步骤
首先,去旷视官网 https://www.faceplusplus.com.cn/ 注册一个免费账号,然后创建一个API key,之后可以到文档中心查看api信息,比如采用compare api
之后需要配置环境,在terminal依次输入以下命令:
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
pip install requests
完整代码(源自上述博客,略微进行修改):
#-*-coding:utf-8-*-
import requests
from json import JSONDecoder
import cv2
import time
import threading
#Face++官方接口封装
def compareIm(faceId1,faceId2):
#传送两个本地图片地址 例如:"D:/Downloads/wt.jpg"
try:
#官方给你的接口地址
compare_url = "https://api-cn.faceplusplus.com/facepp/v3/compare" # 看一下url对不对,一般来说不会变
#创建应用分配的key和secret
key = "你的key" # 注意这里要填
secret = "你的secret" # 注意这里要填
#创建请求数据
data = {"api_key": key, "api_secret": secret}
files = {"image_file1": open(faceId1, "rb"), "image_file2": open(faceId2, "rb")}
#通过接口发送请求
response = requests.post(compare_url, data=data, files=files)
req_con = response.content.decode('utf-8')
req_dict = JSONDecoder().decode(req_con)
#print(req_dict) # 这里可以打印出来看看
#获得json文件里的confidence值,也就是相似度
confindence = req_dict['confidence']
if confindence>75:
print("图片相似度:",confindence)
#confindence为相似度
return confindence
except Exception:
pass
#无限调用face++识别接口,并根据返回相似度判断人脸
def sbdg(i):
while True:
try:
if compareIm(imgdict[i], "wt.jpg") > 75:
print("身份确认是:", i)
except Exception:
pass
#该函数用于不断捕捉摄像头,并保存图片
def getimg():
while True:
#获取摄像头
ret, frame = cap.read()
#保存图片,地址自定,要和sbdg里传递的地址一样(划重点)
cv2.imwrite("wt.jpg", frame) # 和原来的不同的是生成的图片直接存在当前工作目录下
# imgdict={"刘-维":"w1.jpg","邵-":"sz.jpg","黄-国":"hqg.jpg","本-龙":"bzl.jpg","田-文":"tzw.jpg"}
imgdict = {"张三": "a1.png", "李四": "a2.png", "老王": "selfie.jpg"} # 这里自己设置相应的键值对
#开启摄像头
cap = cv2.VideoCapture(0)
#开启捕捉摄像头进程
threading.Thread(target=getimg).start()
#每个匹配对象创建一个线程,为了降低等待延迟
for x in imgdict:
threading.Thread(target=sbdg, args=(x,)).start()
上面代码中有一句
#print(req_dict) # 这里可以打印出来看看
如果将它打印出来,可以看到如官方文档所说的返回值
比如,这是某一次返回的结果(将其放在pycharm中观察)
识别结果: