面部识别----考勤打卡、注册登录、面部支付等等...感觉很高大上,又很方便,下面用python中的框架--django完成一个注册登录的功能,调用百度AI的接口,面部识别在网上也有好多教程,可以自己建模,训练模型,但是这都需要大量的数据去提高模型的准确度,我们直接用了百度AI的接口,十分的快捷、高效、准确,下来码一下代码啦!!

首先需要在百度AI官网注册一个应用,免费,并提供强大的人脸库。

  1.注册表单

                                  <div class="tab-content">
<div class="tab-content-inner active" data-content="signup">
<!-- <form action="{% url 'regist' %}" method="POST"> -->
<div class="row form-group">
<div class="col-md-12">
<input type="text" class="form-control" id="username" placeholder="用户名">
</div>
</div>
<div class="row form-group">
<div class="col-md-12">
<input type="text" class="form-control" id="mobile" placeholder="手机号">
</div>
</div>
<div class="row form-group">
<div class="col-md-12">
<input type="password" class="form-control" id="password" placeholder="密码">
</div>
</div>
<div class="row form-group">
<div class="col-md-12">
<!-- <input type="text" class="form-control" id="mobile_code" placeholder="验证码">
<input type="button" value=" 获取验证码" id="zphone"> -->
</div>
</div>
<div class="row form-group">
<div class="col-md-12">
<label for="password2"><font color='green'>新用户点击注册会有面部特征收集哦!</font></label>
</div>
</div> <div class="row form-group">
<div class="col-md-12">
<input type="submit" class="btn btn-primary" value="注册" id="regist">
</div>
</div>
<!-- </form> -->
</div>

  2.注册时调用摄像头,ajax封装给后端的数据

    <!-- jQuery -->
    <script src="../static/assets/js/jquery.min.js"></script>
    <!-- jQuery Easing -->
    <script src="../static/assets/js/jquery.easing.1.3.js"></script>
    <!-- Bootstrap -->
    <script src="../static/assets/js/bootstrap.min.js"></script>
    <!-- Waypoints -->
    <script src="../static/assets/js/jquery.waypoints.min.js"></script>
    <!-- Carousel -->
    <script src="../static/assets/js/owl.carousel.min.js"></script>
    <!-- countTo -->
    <script src="../static/assets/js/jquery.countTo.js"></script>
    <!-- Magnific Popup -->
    <script src="../static/assets/js/jquery.magnific-popup.min.js"></script>
    <script src="../static/assets/js/magnific-popup-options.js"></script>
    <!-- Main -->
    <script src="../static/assets/js/main.js"></script>

<script>
!(function () {
// 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function (constraints) {
// 首先,如果有getUserMedia的话,就获得它
var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; // 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口
if (!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
} // 否则,为老的navigator.getUserMedia方法包裹一个Promise
return new Promise(function (resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
}
}
const constraints = {
video: true,
audio: false
};
videoPlaying = false;
v = document.getElementById('v');
promise = navigator.mediaDevices.getUserMedia(constraints);
promise.then(stream => {
// 旧的浏览器可能没有srcObject
if ("srcObject" in v) {
v.srcObject = stream;
} else {
// 防止再新的浏览器里使用它,应为它已经不再支持了
v.src = window.URL.createObjectURL(stream);
}
v.onloadedmetadata = function (e) {
v.play();
videoPlaying = true;
};
}).catch(err => {
console.error(err.name + ": " + err.message);
})
document.getElementById('regist').addEventListener('click', function () {
if (videoPlaying) {
mycanvas = document.getElementById('canvas');
mycanvas.width = v.videoWidth;
mycanvas.height = v.videoHeight;
mycanvas.getContext('2d').drawImage(v, 0, 0);
// 图片数据转换成数组
data = mycanvas.toDataURL('image/webp');
document.getElementById('photo').setAttribute('src', data);
// ajax提交数据到后台
$.ajax({
type:"POST",
url:'http://127.0.0.1:8000/regist/',
data:{username:$("#username").val(),mobile:$('#mobile').val(),password:$('#password').val(),mobile_code:$('#mobile_code').val(),imagecontent:data},
dataType:"json",
success:function(data){
alert(data.result)
$('#resText').text(data['result']);
if(data.code == 200){
window.location.href='http://127.0.0.1:8000/home/'
}else{
alert(data.result);
}
}
})
}
}, false);

  3.将已经注册的应用中的各种id和key贴上来

# 导入百度AI
from django.apps import AppConfig
from aip import AipFace
import json
# django内置事务
from django.db import transaction
# 导入状态码
from jyapp.ErrorCode import * # 官网给出的状态码,通过pandas读出保存到 # 百度AI基本信息
class AppConfig(AppConfig):
name = ''
APP_ID = ''
API_KEY = ''
SECRECT_KEY = ''
client = AipFace(APP_ID,API_KEY,SECRECT_KEY)
client.setConnectionTimeoutInMillis(1000*5)
client.setSocketTimeoutInMillis(1000*5)

  4.注册接口,按照接口文档传入必须的参数,手机验证码功能已在本文中注释掉,需要时自行百度。

# 注册
class Regist(View):
def get(self,request):
return render(request,'moban_index.html')
def post(self,request):
# 获取前端数据
imagecontent = request.POST.get('imagecontent')
username = request.POST.get('username')
mobile = request.POST.get('mobile')
password = request.POST.get('password')
# mobile_code = request.POST.get('mobile_code')
# print(imagecontent,username,mobile,password,mobile_code)
# mobile_code_right = request.session.get('message_code')
if not all([imagecontent,username,mobile,password]):
return JsonResponse({'result':'注册信息不能为空'})
# if mobile_code != mobile_code_right:
# return JsonResponse({'result':'请输入正确的验证码'})
else:
# 验证该用户是否存在
user = models.User.objects.filter(mobile=mobile)
if user:
return JsonResponse({'result':'该用户已存在,请直接登录'})
else:
try:
# 引入事务
with transaction.atomic():
# 分割字符串
base_data = imagecontent.split(',')[1]
# base64解码
base64_decode = base64.b64decode(base_data)
# 图片写入本地
with open('static/image/'+mobile+'.jpeg', 'wb') as f:
f.write(base64_decode)
# 添加到mysql数据库
models.User.objects.create(
imagecontent = 'static/image/'+mobile+'.jpeg', # 可以根据需求是否保存注册照片到数据库,也可以通过百度AI人脸库查看
username = username,
mobile = mobile,
password = password,
)
imageType = 'BASE64'
groupId = 'usergroup' # 自定义
userId = mobile
# 加入可选参数
options = {}
options['user_info'] = username
options['quality_control'] = 'NORMAL'
options['liveness_control'] = 'LOW'
result = AppConfig.client.addUser(base_data,imageType,groupId,userId,options)
print(result)
error_code = result['error_code']
if isinstance(error_code,int) and error_code == 0:
request.session['mobile'] = mobile
return JsonResponse({'code':200,'result':'注册成功'})
# return JsonResponse({'result':'注册成功'})
else:
error = ErrorCode().getErrorInfo(error_code)
return JsonResponse({'result':'{}'.format(error)})
except:
return JsonResponse({'result':'注册失败'})

  5.登录.html

                      <div class="tab-content-inner" data-content="login">
<!-- <form action="{% url 'login' %}" method="POST"> -->
<div class="row form-group">
<div class="col-md-12">
<input type="text" class="form-control" id="mobile1" placeholder="请输入手机号">
</div>
</div>
<div class="row form-group">
<div class="col-md-12">
<input type="password" class="form-control" id="password1" placeholder="请输入密码">
</div>
</div> <div class="row form-group">
<div class="col-md-12">
<input type="submit" class="btn btn-primary" value="密码登陆" id="login">
<input type="submit" class="btn btn-primary" value="人脸登陆" id="login_face">
</div>
</div>
<!-- </form> -->
</div>

  6.ajax封装登录信息

    document.getElementById('login_face').addEventListener('click', function () {
if (videoPlaying) {
mycanvas = document.getElementById('canvas');
mycanvas.width = v.videoWidth;
mycanvas.height = v.videoHeight;
mycanvas.getContext('2d').drawImage(v, 0, 0);
data = mycanvas.toDataURL('image/webp');
document.getElementById('photo').setAttribute('src', data); $.ajax({
type:"POST",
url:'http://127.0.0.1:8000/login_face/',
data:{mobile:$('#mobile1').val(),imagecontent:data},
dataType:"json",
success:function(data){
$('#resText').text(data['result']);
document.getElementById('photo').setAttribute('src','static/'+data['point72src']);
console.log(data['point72src'])
if(data.code == 200){
alert(data.result)
window.location.href='http://127.0.0.1:8000/idcard/'
}else{
alert(data.result);
}
}
})
}
}, false);

  7.人脸快速登录

class Login_face(View):
def get(self,request):
return render(request,'moban_index.html')
def post(self,request):
imagecontent = request.POST.get('imagecontent')
mobile = request.POST.get('mobile')
if not all([imagecontent,mobile]):
return JsonResponse({'code':100,'result':'登录信息不能为空'})
else:
user = models.User.objects.filter(mobile=mobile)
if not user:
return JsonResponse({'code':113,'result':'用户不存在'})
else:
base_data = imagecontent.split(',')[1]
imageType = 'BASE64'
groupIdList = 'usergroup'
# 加入可选参数
options = {}
options['max_user_num'] = 1
options['quality_control'] = 'NORMAL'
options['liveness_control'] = 'LOW'
# options['user_id'] = mobile
result = AppConfig.client.search(base_data,imageType,groupIdList,options)
print(result)
error_code = result['error_code']
try:
user_id = result['result']['user_list'][0]['user_id']
score = result['result']['user_list'][0]['score']
if isinstance(error_code,int) and error_code == 0 and user_id == mobile and score >= 90:
request.session['mobile'] = mobile
return JsonResponse({'code':200,'result':'快速登录成功'})
else:
error = ErrorCode().getErrorInfo(error_code)
return JsonResponse({'result':'{}'.format(error)})
except:
error = ErrorCode().getErrorInfo(error_code)
return JsonResponse({'result':'{}'.format(error)})

结束!

django--调用百度AI接口实现人脸注册登录的更多相关文章

  1. WebApiClientCore简约调用百度AI接口

    WebApiClientCore WebApiClient.JIT/AOT的netcore版本,集高性能高可扩展性于一体的声明式http客户端库,特别适用于微服务的restful资源请求,也适用于各种 ...

  2. Winform调用百度地图接口简单示例

    1.首先用一个html文件调用百度地图接口(主要注册一个序列号):   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  3. c# 利用AForge和百度AI开发实时人脸识别

    baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...

  4. 使用百度ai接口加图灵机器人完成简单web版语音对话

    app文件 from flask import Flask, request, render_template, jsonify, send_file from uuid import uuid4 i ...

  5. js调用百度地图接口

    原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...

  6. selenium自动化 | 借助百度AI开放平台识别验证码登录职教云

    #通过借助百度AI开放平台识别验证码登录职教云 from PIL import Image from aip import AipOcr import unittest # driver.get(zj ...

  7. Python实战---制作专属有声小说(调用百度语音合成接口)

    这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来. 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调 ...

  8. 人工智能-调百度AI接口+图灵机器人

    1.登陆百度AI的官网 1.注册:没有账号注册 2.创建应用 3.创建应用 4.查看应用的ID 5.Python代码 from aip import AipSpeech APP_ID = " ...

  9. [初识]使用百度AI接口,图灵机器人实现简单语音对话

    一.准备 1.百度ai开放平台提供了优质的接口资源https://ai.baidu.com/  (基本免费) 2.在语音识别的接口中, 对中文来说, 讯飞的接口是很好的选择https://www.xf ...

随机推荐

  1. leaflet 结合 Echarts4 实现散点图(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  2. Linux系统学习 十四、VSFTP服务—配置文件解析、客户端使用

    3.配置文件解析 默认配置选项: 一般情况下不允许匿名用户登录 全局配置选项:(手工添加) listen_address=192.168.4.1             #设置监听地址 listen_ ...

  3. libnl概述

    以下三个库都基于其核心库libnl: libnl-route:用于和Kernel中的Routing子系统交互. libnl-nf:用于和Kernel中的Netfilter子系统交互. libnl-ge ...

  4. ubuntu18.04因java路径原因启动jenkins失败

    我的云服务器ubuntu18.04上本来装了jenkins,今天安装完tomcat后,将原有的openjdk卸载了,安装了jdk8u192, 此时浏览器访问8080端口显示的就是tomcat安装成功的 ...

  5. python大作业二

    一.存入csv 上次爬取到了所需要的内容,但是没有存入到csv中,这次存入了csv文件中,代码如下: import requests from bs4 import BeautifulSoup imp ...

  6. table+分页+模糊查询

    这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml

  7. jenkins构建,拉取不到最新版本代码,报clock of the subversion server appears to be out of sync

    一.问题描述 今天遇到个问题,我这边提交了代码后,一般会马上去jenkins上点一下,构建到开发环境上. 但是发现修改没生效,后来发现,提交的版本假设是3250,但是jenkins构建使用的版本为32 ...

  8. ETCD:gRPC命名与发现

    原文地址:gRPC naming and discovery etcd提供一个gRPC解析器支持备用的命名系统,该命名系统从etcd获取主机以发现gRPC服务.以下机制基于监视对以服务名称为前缀的Ke ...

  9. 【HNOI 2017】礼物

    Problem Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个装饰物,并且每个装饰物 ...

  10. 一年半前端工作经验试水杭州:我是如何拿下网易、阿里和滴滴 offer 的

    前言 笔者毕业于东北大学,大学毕业社招进入环球网,前端开发工程师一职.技术栈:React+node,Github 地址 成果 来到杭州的目标非常的明确,大厂.其实就是网易.阿里和滴滴.好在基本三家都拿 ...