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制作简单的网页爬虫
Nov 22 Python
全面了解python字符串和字典
Jul 07 Python
Python算法应用实战之队列详解
Feb 04 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
python实现批量注册网站用户的示例
Feb 22 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
python 画条形图(柱状图)实例
Apr 24 Python
pytorch 如何使用float64训练
May 24 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读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
详解a++和++a的区别
2017/08/30 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
简述Python中的面向对象编程的概念
2015/04/27 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
你应该知道的python列表去重方法
2017/01/17 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python常见字典内建函数用法示例
2018/05/14 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
详解python和matlab的优势与区别
2019/06/28 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
P/Invoke是什么
2015/07/31 面试题
计算机网络毕业生自荐信
2013/10/01 职场文书
高三毕业生自我鉴定
2013/12/20 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
婚假请假条怎么写
2014/04/10 职场文书
法制宣传月活动总结
2014/04/29 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
男生贾里读书笔记
2015/06/30 职场文书