前言

前两天在网上看到了一篇博客,觉得挺好玩的,自己对于人脸识别这一块有点兴趣,因此进行了解,整理如下。

之前看到这篇文章,进行实现了一下。文章里面是在windows下进行的,我在ubuntu16.04里面进行验证了一下。我的python 版本为3.5,模块:opencv(需要手动安装),requests(用于接口请求)。本文代码和原来的代码大体上一样。

步骤

首先,去旷视官网 https://www.faceplusplus.com.cn/ 注册一个免费账号,然后创建一个API key,之后可以到文档中心查看api信息,比如采用compare api

javaopencv 人脸相似度 opencv人脸比对算法_人脸识别


之后需要配置环境,在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)					# 这里可以打印出来看看

如果将它打印出来,可以看到如官方文档所说的返回值

javaopencv 人脸相似度 opencv人脸比对算法_相似度_02


比如,这是某一次返回的结果(将其放在pycharm中观察)

javaopencv 人脸相似度 opencv人脸比对算法_python_03


识别结果:

javaopencv 人脸相似度 opencv人脸比对算法_python_04