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演示数型数据结构的教程
Apr 03 Python
Python全局变量操作详解
Apr 14 Python
Python标准库之Sys模块使用详解
May 23 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
快速入门python学习笔记
Dec 06 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
Python collections.deque双边队列原理详解
Oct 05 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
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
php如何获取Http请求
2020/04/30 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
图文详解WinPE下安装Python
2016/05/17 Python
python 日期排序的实例代码
2019/07/11 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python 读取.nii格式图像实例
2020/07/01 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
绩效工资分配方案
2014/01/18 职场文书
金融事务专业求职信
2014/04/25 职场文书
见习报告的格式
2014/10/31 职场文书
老龙头导游词
2015/02/11 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python