微信小程序之人脸识别(1)

首先需要在js代码中访问上传文件的wx.uploadFile()接口,将本地资源上传到开发者服务器,客户端发起一个 HTTPS POST 请求,其中content-ytype为multipart/form-data。返回一个 uploadTask 对象,通过 uploadTask,可监听上传进度变化事件,以及取消上传任务。

下面是我的js代码:将访问接口的代码写入一个方法中,方便调用。

function upload(that, id) {
  if (that.data.files.length == 0) {
    return;
  }
  wx.uploadFile({
    url: '###', //仅为示例,非真实的接口地址
    filePath: that.data.files[0],
    name: 'file',
    formData: {
      'id': id
    },
    success: function (res) {
      var data = res.data
      var json = JSON.parse(data)
      // console.log(data)
      wx.showToast({
        title: json.msg,
        icon:'success',
        duration:2000
      })
      setTimeout(function () {
        wx.navigateTo({
          url: '../index/index',
        })
      }, 2000)
    }
  })
}

url访问的接口代码如下:需要注意的是上传的文件大小不能超过2mb,为了方便以后可以更换图片,可以将replace属性设置为true,为了方便以后查找方便,将图片的名称以学号命名,并将autoSub属性设置为false,禁止自动创建文件夹。

// 上传图片
    public function upload($id=''){
      $no = M('student')->where("id={$id}")->getField('no');
      $dir = "./Uploads/";//上传文件路径
      $upload = new \Think\Upload();// 实例化上传类
      $upload->maxSize = 2048000 ;// 设置附件上传大小
      $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
      $upload->saveName = $no;
      $upload->replace = true;
      $upload->autoSub = false;
      $upload->rootPath = $dir; // 设置附件上传根目录
      // 上传单个文件
      $info = $upload->uploadOne($_FILES['file']);
      if(!$info) {// 上传错误提示错误信息
          return $this->ajaxReturn(array('error'=>true,'msg'=>$upload->getError()));
      }else{// 上传成功 获取上传文件信息
        $file = $dir . $info['savepath'].$info['savename'];
        $image = base64_encode(file_get_contents($file));
        $this->facevalid($no,$image);  
        $m = M('image');
        $data = $m->where("no='{$no}'")->find();
        if($data){
          // 有数据,更新
          $m->where("no='{$no}'")->save(array('base64'=>$image,'path'=>$file));
        }else{
          // 无数据,添加
          $m->add(array('no'=>$no,'base64'=>$image,'path'=>$file,'guid'=>myguid()));
        }
        return $this->ajaxReturn(array('error'=>false,'msg'=>'图像采集成功'));
      }

接下来就可以编写后台代码来讲人脸图片上传到百度云的人脸库里了。(下列代码还未完成只可在本地运行)先检测一下图片是否存在,并对图片进行base64编码。通过返回的数据判断图片是否合格,若人脸数目为1且可靠性为1则写入人脸库,并且可以分组写入。

public function facevalid(){
      $file = './Uploads/2018-05-20/5b015a6f96c41.jpeg';
      if(!file_exists($file)){
          die('文件不存在');
      }
      $image = file_get_contents($file);
      $image = base64_encode($image);
      $options = array();
      $options['max_face_num'] = 2;
      $client = $this->init_face();
      $ret = $client->detect($image,'BASE64',$options);
      if($ret['error_code']==0){//有人脸
          $result = $ret['result'];
          $face_num = $result['face_num'];
          if(1==$face_num){//人脸数目为1
              $face_probability = $result['face_list'][0]['face_probability'];
              if(1==$face_probability){//可靠性为1
                  $guid = myguid();
                  $group = $this->face_group();
                  $client->addUser($image,'BASE64',$group,$no);
                  echo '人脸检测完成,并已入库';
              }else{
                  die('可靠性为:' . $face_probability . ',上传失败!');
              }
          }else{
              die('人脸数量大于1,上传失败!');
          }
      }else{
        die('没有人脸,上传失败!');
      }
    }

init_face方法里存放了自己的appid、aipkey和secretkey,在这里调用了百度云的服务端SDK(https://ai.baidu.com/sdk#bfr)。

private function init_face(){
        $APP_ID = '';
        $API_KEY = '';
        $SECRET_KEY = '';
        $dir = APP_PATH . '/face-sdk/';
        require_once $dir . 'AipFace.php';
        return new \AipFace($APP_ID,$API_KEY,$SECRET_KEY);
    }

face_group方法主要功能是给人脸库分组,如果人脸库存在就直接写入,如果没有则新建一个再写入。

public function face_group(){
      $groupname = 'student';
      $client = $this->init_face();
      $ret = $client->getGroupList();
      if($ret['error_code']==0){
          $grouplist = $ret['result']['group_id_list'];
          if(in_array($groupname, $grouplist)){
              return $groupname;
          }else{
              $ret = $client->groupAdd($groupname);
              if($ret['error_code']==0){
                  return $groupname;
              }else{
                  return false;
              }
          }
      }else{
          return false;
      }
    }
上述代码还有很多不足之处,望指出。

你可能感兴趣的:(微信小程序之人脸识别(1))