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 字典dict使用介绍
Nov 30 Python
Python实现处理管道的方法
Jun 04 Python
详解Python发送邮件实例
Jan 10 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
python3.5绘制随机漫步图
Aug 27 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
Python的UTC时间转换讲解
Feb 26 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
新手入门学习python Numpy基础操作
Mar 02 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
Python基本的内置数据类型及使用方法
Apr 13 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
mysql总结之explain
2012/02/27 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
使用Python实现一个简单的项目监控
2015/03/31 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
六查六看剖析材料
2014/02/15 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
会议主持词结束语
2015/07/03 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript