OpenCV+face++实现实时人脸识别解锁功能


Posted in Python onAugust 28, 2019

本文实例为大家分享了OpenCV+face++实现实时人脸识别解锁功能的具体代码,供大家参考,具体内容如下

1.背景

最近做一个小东西,需要登录功能,一开始做的就是普通的密码登录功能,但是之前看到过python可以做人脸识别,所以我就开了下脑洞,能不能实现一个自己的刷脸解锁功能。

2.知识储备

  • python基础语法
  • opencv
  • face++文档
  • requests库

3.基本思路

准备一张你想要被识别出的人脸照片,后面刷脸就是按照这张照片来识别,如果和照片中是同一个人就解锁,刷脸就是打开摄像头获取电脑面前人的人脸,然后与之前那张照片比对。

4.代码讲解

看下识别的效果:

OpenCV+face++实现实时人脸识别解锁功能

第一个函数就是打开摄像头并保存图片:

#从摄像头读取图片并保存
def getpicture():
  cap = cv2.VideoCapture(0)#打开摄像头
  cascade = cv2.CascadeClassifier("E:\OpenCV\sources\data\haarcascades\haarcascade_frontalface_default.xml")#这里是是自己的人脸识别xml路径
  while True:
    # get a frame
    ret, frame = cap.read()#捕获图片
    # show a frame
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#转为灰度图
    rect = cascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5),flags=cv2.cv.CV_HAAR_SCALE_IMAGE) # 使用模板匹配图形
    for x, y, z, w in rect:
      cv2.rectangle(frame, (x, y), (x + z, y + w), (0, 0, 255), 2)# 函数的参数分别为:图像,左上角坐标,右下角坐标,颜色,宽度
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):#按下q拍照
      cv2.imwrite("images\client.jpg", frame)#相对路径,储存图片
      break
  cap.release()
  cv2.destroyAllWindows()

第二个函数是将样本图片与摄像头读取的图片上传到face++进行处理,并拿到它的face_token,该函数主要用到的就是requests库与face++的api。

def upload_img(fileDir, oneface=True):
  url = '%s/detect?api_key=%s&api_secret=%s' % (
    BASE_URL, API_KEY, API_SECRET)
  #注意参数名与api文档一致
  files = {'image_file': (os.path.basename(fileDir), open(fileDir, 'rb'),
           mimetypes.guess_type(fileDir)[0]), }
  r = requests.post(url, files=files)
  faces = r.json().get('faces')
  #print faces
  if faces is None:
    print('There is no face found in %s' % fileDir)
  else:
    return faces[0]['face_token']#返回face_token

第三个函数是比较两张图片的face_token:

def compare(face_token1,face_token2):
  url = '%s/compare' % BASE_URL
  params = BASE_PARAMS
  params['face_token1'] = face_token1
  params['face_token2'] = face_token2
  r = requests.post(url, params)
  #print r.status_code
  #print r.json()
  return r.json().get('confidence')#返回两张照片的相似度

最后判断一下compare()函数的返回值就知道两张图片是不是同一个人了,再程序中加一个判断语句就可以实现基本的解锁功能了。

完整代码:

#! usr/bin/env python
#-*- coding:utf-8 -*-

import requests
import os
import mimetypes  #判断文件类型
import cv2
import time
import win32api
import win32con

BASE_URL = "https://api-cn.faceplusplus.com/facepp/v3"
API_KEY = "g_vhMthXCQEzF0gZG5-o0ICNDhr3-80b"
API_SECRET = "2HD5ysubTeZTwo20JJTudY0cvZN1BPLt"
BASE_PARAMS = {
  'api_key':'g_vhMthXCQEzF0gZG5-o0ICNDhr3-80b',
  'api_secret':'2HD5ysubTeZTwo20JJTudY0cvZN1BPLt'
}
def upload_img(fileDir, oneface=True):
  url = '%s/detect?api_key=%s&api_secret=%s' % (
    BASE_URL, API_KEY, API_SECRET)
  #注意参数名与api文档一致
  files = {'image_file': (os.path.basename(fileDir), open(fileDir, 'rb'),
           mimetypes.guess_type(fileDir)[0]), }
  r = requests.post(url, files=files)
  faces = r.json().get('faces')
  #print faces
  if faces is None:
    print('There is no face found in %s' % fileDir)
  else:
    return faces[0]['face_token']



def compare(face_token1,face_token2):
  url = '%s/compare' % BASE_URL
  params = BASE_PARAMS
  params['face_token1'] = face_token1
  params['face_token2'] = face_token2
  r = requests.post(url, params)
  #print r.status_code
  #print r.json()
  return r.json().get('confidence')


def getpicture():
  cap = cv2.VideoCapture(0)
  cascade = cv2.CascadeClassifier("E:\OpenCV\sources\data\haarcascades\haarcascade_frontalface_default.xml")#这里是是自己的人脸识别xml路径
  while True:
    # get a frame
    ret, frame = cap.read()
    # show a frame
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    rect = cascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5),flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
    for x, y, z, w in rect:
      cv2.rectangle(frame, (x, y), (x + z, y + w), (0, 0, 255), 2)
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      cv2.imwrite("images\client.jpg", frame)#相对路径
      break
  cap.release()
  cv2.destroyAllWindows()


getpicture()
print u"                   数据读取中。。。。\n"
face1 = upload_img(u"images\demo4.jpg")
print u"                        正在校对人脸。。。。。\n"
time.sleep(5)#防止出现qps
print u"                               再等一下。。。。。\n"
face2 = upload_img(u"images\client.jpg")
confidence = compare(face1,face2)
if confidence>=70:
  #print u"同一个人"
  #win32api.ShellExecute(0,'op','genealogy.exe','','',1)
  win32api.MessageBox(0, u"刷脸成功", u"家谱管理系统", win32con.MB_OK)
  #这里写你想要继续执行的代码
else:
  win32api.MessageBox(0, u"刷脸失败", u"家谱管理系统", win32con.MB_OK)
  #print u"不是同一个人"

运行效果:

OpenCV+face++实现实时人脸识别解锁功能

因为样本图片是我,所以用白岩松是不能成功的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现堆栈与队列的方法
Jan 15 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
python3.7 sys模块的具体使用
Jul 22 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
Python MNIST手写体识别详解与试练
Nov 07 Python
Python与C++中梯度方向直方图的实现
Mar 17 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 Python
Python的垃圾回收机制详解
Aug 28 #Python
Python通过cv2读取多个USB摄像头
Aug 28 #Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 #Python
Django--权限Permissions的例子
Aug 28 #Python
Python中函数的返回值示例浅析
Aug 28 #Python
django认证系统实现自定义权限管理的方法
Aug 28 #Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 #Python
You might like
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
PHP的类 功能齐全的发送邮件类
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
php 方便水印和缩略图的图形类
2009/05/21 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
python已协程方式处理任务实现过程
2019/12/27 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
详解python程序中的多任务
2020/09/16 Python
Ref与out有什么不同
2012/11/24 面试题
留守儿童工作方案
2014/06/02 职场文书
红头文件任命书范本
2014/06/05 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
骨干教师考核评语
2014/12/31 职场文书
工作能力自我评价2015
2015/03/05 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
MySQL普通表如何转换成分区表
2022/05/30 MySQL