1. 程式人生 > >微信小程式之人臉識別(2)

微信小程式之人臉識別(2)

上一篇部落格已經將人臉的照片上傳到了人臉庫,接下來需要做的就是登入時拍照儲存並與人臉庫的圖片進行對比,當score大於95即識別成功!

下面是wxml程式碼,主要用的就是camera元件,點選按鈕拍照並儲存,利用開關來控制使用前置還是後置攝像頭。

<!--pages/camera/camera.wxml-->
<camera device-position="{{switch}}" flash="off" binderror="error" style="width: 100%; height: 300px;"></camera>
<button type="primary" bindtap="takePhoto" class='btn'>刷臉登入</button>
<view class='weui-cell_ft switch'>
    <switch checked bindchange='switch1Change'></switch>
</view>

下面是js程式碼。wx.createCameraContext()介面的作用是建立並返回camera元件上下文cameraContext物件,cameraContext與頁面的camera元件繫結,通過它可以控制對應的camera元件。拍照以後再訪問wx.uploadFile()介面將圖片儲存到伺服器中方便使用。返回的資料中有score即可判斷是否識別成功。

Page({
  /**
   * 頁面的初始資料
   */
  data: {
    src:null,
  },
  switch1Change: function (e) {
    if (e.detail.value) {
      this.setData({ switch: 'front' })
    } else {
      this.setData({ switch: 'back' })
    }
  },
  takePhoto() {
    const ctx = wx.createCameraContext()
    ctx.takePhoto({
      quality: 'high',
      success: (res) => {
        this.setData({
          src: res.tempImagePath
        })
        console.log(res)
        wx.uploadFile({
          url: '###', //僅為示例,非真實的介面地址
          filePath: this.data.src,
          name: 'file',
          formData: {
          },
          success: function (res) {
            console.log(res)
            wx.showModal({
              title: "提示",
              content: res.data,
              showCancel: false,
              confirmText: "確定"
            })
          }
        })
      }
    })
  }, 
  error(e) {
    console.log(e.detail)
  }
})

下面是後臺控制器程式碼。將圖片上傳到伺服器中,並呼叫search方法從人臉庫中查詢對應的人臉圖片,並返回對比的資料。如果error_code為0即對比成功,若分數高於95即識別成功,並通過返回的user_id從資料表中查詢到該學生的資訊。

// 刷臉登入
    public function login(){
      // 上傳檔案路徑
      $dir = "./Uploads/temp/";
      if(!file_exists($dir)){
        mkdir($dir,0777,true);
      }
      $upload = new \Think\Upload();
      $upload->maxSize = 2048000 ;// 設定附件上傳大小
      $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設定附件上傳型別
      $upload->savepath = '';
      $upload->autoSub = false;
      $upload->rootPath = $dir; // 設定附件上傳根目錄
      // 上傳單個檔案
      $info = $upload->uploadOne($_FILES['file']);
      if(!$info) {// 上傳錯誤提示錯誤資訊
          echo json_encode(array('error'=>true,'msg'=>$upload->getError()),JSON_UNESCAPED_UNICODE);
      }else{// 上傳成功 獲取上傳檔案資訊
        $file = $dir . $info['savepath'].$info['savename'];
        $image = base64_encode(file_get_contents($file));
        $client = $this->init_face();
        $options['liveness_control'] = 'NORMAL';
        $options['max_user_num']  = '1';
        $ret = $client->search($image,'BASE64','student',$options);
        // echo json_encode($ret,JSON_UNESCAPED_UNICODE);
        // exit;
        if($ret['error_code']==0){
          $user = $ret['result']['user_list'][0];
          $no = $user['user_id'];
          $score = $user['score'];
          if($score>=95){
            $data = M('student')->where("no = '{$no}'")->find();
            $data['score'] = $score;
            // $data['name'] = json_decode($data['name'],true);
            // $data['sex'] = json_decode($data['sex'],true);
            echo '識別成功' . json_encode($data,JSON_UNESCAPED_UNICODE);
          }else{
            echo '識別失敗' . $data['score'];
          }
        }
      }
    }