前面写了人脸注册的功能。现在再来实现人脸登录的功能就要简单得多了,还是先上PHP部分的代码:

PHP代码(搜索人脸库并返回对比结果)

<?php 

date_default_timezone_set("Asia/Shanghai"); //设置时区
$code = $_FILES['file'];//获取小程序传来的图片
if(is_uploaded_file($_FILES['file']['tmp_name'])) {
//把文件转存到你希望的目录
    $uploaded_file=$_FILES['file']['tmp_name'];
//我们给每个用户动态的创建一个文件夹$user_path=$_SERVER['DOCUMENT_ROOT']."uploadphoto/hwphoto/userface/tmp";
//判断该用户文件夹是否已经有这个文件夹
    if(!file_exists($user_path)) {
        mkdir($user_path);
    }
    $file_true_name=$_FILES['file']['name'];
    $move_to_file=$user_path."/".date("Y-m-d")."-".uniqid().substr($file_true_name,strrpos($file_true_name,"."));
//这里还是需要把照片保存到服务器端才能对比。只有设定个定时任务定时清除这个文件夹的照片了
    move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file));
}
class post{
private function init_face(){
        $APP_ID = 'XXXXXX';
        $API_KEY = 'XXXXXXXX';
        $SECRET_KEY = 'XXXXXXXX';
        require_once  '/www/wwwroot/www.ailaiyun.com/AipFace.php';
        return new \AipFace($APP_ID,$API_KEY,$SECRET_KEY);
    }
public function facevalid(){
	global $move_to_file;
    $file = "$move_to_file"; //照片服务器路径
    if(!file_exists($file)){
        die('文件不存在');
    }
//还是要先判断照片的真实性
    $image = file_get_contents($file);
    $image = base64_encode($image);
    $options = array();
    $options['liveness_control'] = 'LOW';
    $options['max_user_num']  = '1';  
    $client = $this->init_face();
    $ret = $client->detect($image,'BASE64',$options);
    if($ret['error_code']==0){   //有人脸
        $result = $ret['result'];        
        $face_num = $result['face_num'];
        $opp['user_info'] ='1';
        if(1==$face_num){    //人脸数目为1
            $face_probability = $result['face_list'][0]['face_probability'];
            if(1==$face_probability){   //可靠性为1
//调动人脸对比库搜索对比百度人脸库里的照片
            $ret_search = $client->search($image,'BASE64','stu',$options);
//输出返回的结果。这里有个坑,在JS里面解决
                 echo json_encode($ret_search,JSON_UNESCAPED_UNICODE);             
            }else{
                die('可靠性为:' . $face_probability);
            }
        }else{
            die('人脸数量大于1');
        }
    }
}
}
$post =new post();
echo $post->facevalid();
 ?>

js代码:

Page({
  data: {
    nickName: "", //用户昵称
    src: "", //上传到服务器的照片路径
    msg: "", //服务器返回信息
    url: "", //注册成功后自动回到登录界面
  },

  //拍照
  face() {
    var that = this
    var user_id = that.data.nickName
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['camera'],
      success(res) {
        console.log(res)
        wx.showLoading({
          title: '人脸对比中',
          mask: true
        })
        //上传人脸进行注册
        var tempFilePaths = res.tempFilePaths
        console.log(tempFilePaths[0])
        wx.uploadFile({
          url: 'https://www.ailaiyun.com/xxxxxx.php',
          filePath: tempFilePaths[0],
          name: 'file',
          success(res) {
            wx.hideLoading()
            wx.showToast({
              title: '人脸登录成功',
            })
            console.log(res.data)
            var data = res.data
//这里解决服务器返回结果PHP输出的坑。把返回的结果转换成可提取的JSON对象形式。。
            var obj = JSON.parse(data)
            console.log(obj)
//提取需要的信息
            var nickName = obj.result.user_list["0"].user_id
            var score = obj.result.user_list["0"].score
            if(score>80){
              that.setData({
                nickName
              })
//把返回的用户名定义为全局函数。方便登录后识别用户
              var app = getApp(); // 取得全局App
              app.globalData.name = that.data.nickName // 取得全局变量需要的值
              wx.redirectTo({
                url: '../stu_edit_info/stu_edit_info',
              })
            }
            else{
              wx.showToast({
                title: '人脸认证失败,请重试!',
                icon: 'none'
              })
            }
          }
        })
      }
    })
  },
})

wxml代码:

<!--index.wxml-->
<view class="container">
  <view class='img'>
    <image src='../images/index.jpg'></image>
  </view>
  <text class='title'>人脸登录系统</text>
  <view>
    <button class='btn-face' bindtap='face'>人脸登录</button>
  </view>
</view>

wxss代码:

/**index.wxss**/
.img{
  width: 100%;
}
.img image{
  width: 100%;
}
.title{
  margin-top: 20rpx;
  font-size: 40rpx;
  margin-bottom: 40rpx;
  font-weight: bolder;
}
.btn-face{
  border: 10rpx solid rgb(58,160,255);
  margin-top: 20rpx;
  padding: 10rpx;
  border-radius: 50%;
  width:300rpx;
  height: 300rpx;
  line-height: 460rpx;
  text-align: center;
  background: url("https://www.ailaiyun.com/temp-img/face.png") no-repeat center;
  background-size: 50%;
  background-color: whitesmoke;
  color: rgb(58, 160, 255);
  font-weight: bold;
}
.btn-login{
  background-color:  rgb(19, 184, 19);
  margin-top: 20rpx;
  padding: 10rpx;
  border-radius: 20rpx;
  width: 300rpx;
  text-align: center;
}
.btn-res{
  background-color:  rgb(243, 167, 26);
  margin-top: 20rpx;
  padding: 10rpx;
  border-radius: 20rpx;
  width: 300rpx;
  text-align: center;
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注