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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python常用列表数据结构小结
Aug 06 Python
Python正则表达式如何进行字符串替换实例
Dec 28 Python
python文件特定行插入和替换实例详解
Jul 12 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python之生成多层json结构的实现
Feb 27 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 Python
python 基于opencv实现图像增强
Dec 23 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 Python
详解Python描述符的工作原理
Jun 11 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
PHP 微信支付类 demo
2015/11/30 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Python configparser模块常用方法解析
2020/05/22 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
大学系主任推荐信范文
2013/12/24 职场文书
博士生导师推荐信
2014/07/08 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
基层党建工作简报
2015/07/21 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
导游词之无锡东林书院
2019/12/11 职场文书