python 3 利用Face++官网接口和opencv实现实时人脸比对


这里提示两种人脸识别方法:

        1、在线:基于开放平台提供的api来做识别,

        2、离线:通过开源库 face_recognition 需要自己安装

我这里使用的在线api的方式做的。第二种在研究中,关键是github全英文的看的眼睛疼,英语水平有限,


下面开始介绍第一种方法

需要的模块和工具以及接口

环境:windows7 ,python 3

模块 : opencv(需要手动安装),requests(用于接口请求)

api:旷视人脸对比 Compare API(1:1)(免费的)


第一步:

首先去旷视官网 https://www.faceplusplus.com.cn/   注册一个免费账号

然后创建一个API key


可以查看api文档来写调用方法,我用的是compare api,1:1头像比对,你也可以用其他的比如seach API 1:N的 ,


第二步:

本文适用于win7 64位系统 下的Python3.5。python3.5、pip为必备前提。python可在官网下载:https://www.python.org/downloads/windows/,建议使用exe installer,pip会随之安装。

一切就绪以后以管理员身份运行cmd或PowerShell。依次输入以下命令:

pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
你如果安装了两个python版本,这些包一定安装在py3环境下哦,你可以这样输入安装
比如:py -3 -m pip install opencv-python
其余包安装也一样要加  py -3 -m pip install 包名

如果多次下载失败,可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下载whl包安装,安装whl包依然使用pip

 
  
 py -3 -m  pip install 包的位置(如:C:\download\xxx.whl)
查看你安装的包输入
 py -3 -m pip list

第三步:

介绍我的小程序

(1)创建调用api的函数key和secret都是你创建的

#Face++官方接口封装
def compareIm(faceId1,faceId2):
    #传送两个本地图片地址 例如:"D:/Downloads/wt.jpg"
        try:
            #官方给你的接口地址
            compare_url = "https://api-cn.faceplusplus.com/facepp/v3/compare"
            #创建应用分配的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
            #print("无法识别!")

你如果不想你的程序在运行时报错终止运行,就和我一样捕捉异常,报错没关系你处理就好啦


(2)调用接口实现图片里人脸对比

#无限调用face++识别接口,并根据返回相似度判断人脸
def sbdg(i):
    while True:
         try:
            if compareIm(imgdict[i], "D:/Downloads/wt.jpg") > 75:
                print("身份确认是:", i)
         except Exception:
             pass

通过他返回的两张照片的相似度来判断,我设置的是>75就表示是同一个人


(3)获得摄像头数据,也就是一张图片,获取之前要

#开启摄像头
cap = cv2.VideoCapture(0)
#该函数用于不断捕捉摄像头,并保存图片
def getimg():
    while True:
        #获取摄像头
        ret, frame = cap.read()
        #保存图片,地址自定,要和sbdg里传递的地址一样
        cv2.imwrite("D:/Downloads/wt.jpg", frame)

(4)关键是利用多线程去做判断,如果你的样本图不在同一文件夹下,请自己修改成绝对路径

imgdict={"刘维-":"w1.jpg","邵-":"sz.jpg","黄-国":"hqg.jpg","本-龙":"bzl.jpg","田-文":"tzw.jpg"}
#开启摄像头
cap = cv2.VideoCapture(0)
#开启捕捉摄像头进程
threading.Thread(target=getimg).start()
#每个匹配对象创建一个线程,为了降低等待延迟
for x in imgdict:
    threading.Thread(target=sbdg, args=(x,)).start()

完整程序如下:

    刚开始我是用循环去遍历我的图片字典,遍历的时候去调用api去比对,这样我要等前一张照片比对完下一张才开始比,顺序执行代码效率就很低,所以我利用多线程把当前摄像头捕捉的图片去与每个人的样本图片同时(交替调用)去比对,这样效率就很不错了,由于我对捕捉的图片文件只有读操作没有写操作,我就不用设置线程锁了,设置线程锁会影响多线程效率。

#-*-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"
            #创建应用分配的key和secret
            key = "0I8318-_-gxdx_8bjPqk2OSW_wwwwwz"
            secret = "ACa8873xwYJ4nA52crL2XPmn-aaaa"
            #创建请求数据
            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
            #print("无法识别!")


#无限调用face++识别接口,并根据返回相似度判断人脸
def sbdg(i):
    while True:
         try:
            if compareIm(imgdict[i], "D:/Downloads/wt.jpg") > 75:
                print("身份确认是:", i)
         except Exception:
             pass

#该函数用于不断捕捉摄像头,并保存图片
def getimg():
    while True:
        #获取摄像头
        ret, frame = cap.read()
        #保存图片,地址自定,要和sbdg里传递的地址一样
        cv2.imwrite("D:/Downloads/wt.jpg", frame)



imgdict={"刘-维":"w1.jpg","邵-":"sz.jpg","黄-国":"hqg.jpg","本-龙":"bzl.jpg","田-文":"tzw.jpg"}
#开启摄像头
cap = cv2.VideoCapture(0)
#开启捕捉摄像头进程
threading.Thread(target=getimg).start()
#每个匹配对象创建一个线程,为了降低等待延迟
for x in imgdict:
    threading.Thread(target=sbdg, args=(x,)).start()





结果截图:


C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe E:/python工作空间/人脸识别与对比/face_sssb.py
图片相似度: 85.244
身份确认是: 刘-维  
图片相似度: 85.603
身份确认是: 刘-维
图片相似度: 86.958
身份确认是: 刘-维
图片相似度: 87.702
身份确认是: 刘-维

Process finished with exit code 1



我这里没有利用人脸跟踪,也没有用这条语句输出摄像头效果,偷偷摸摸的识别 哈哈~ ,你可以用人脸检测,然后把检测到的人脸图片发送邮箱方式到自己的电子邮箱,能做什么看你们的造化了,新手才开始发博客,希望与你们多交流

 
 
ret, frame = cap.read()
cv2.imshow("111", frame)


猜你喜欢

转载自blog.csdn.net/qq_38228830/article/details/80258998