微信小程序实现人脸识别


Posted in Javascript onMay 25, 2018

本文为大家分享了微信小程序人脸识别的具体代码,供大家参考,具体内容如下

首先,我们要有开发者工具,今天所说的是后端和前端联合起来实现的。

在PHP的控制器中写一个upload方法,代码如下:

public function upload($id=''){ 
 if(empty($id)){ 
  return false; 
 } 
 
 $no = M("student")->where("id={$id}")->getField('no'); 
 $dir = "./Upload/studentface/"; 
 if(!file_exists($dir)){ 
  mkdir($dir, 0777, true); 
 } 
 $upload = new \Think\Upload();// 实例化上传类 
 $upload->maxSize = 3145728 ;// 设置附件上传大小 
 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 
 $upload->rootPath = $dir; // 设置附件上传根目录 
 $upload->savePath = ''; // 设置附件上传(子)目录 
 $upload->saveName = $no; 
 $upload->replace = true; 
 $upload->autoSub = false; 
 // 上传文件 
 $info = $upload->uploadOne($_FILES['file']); 
 if(!$info) {// 上传错误提示错误信息 
  // return $this->ajaxReturn(array('error'=>true,'msg'=>$upload->getError())); 
  return json_encode(array('error'=>true,'msg'=>$upload->getError()),JSON_UNESCAPED_UNICODE); 
 }else{// 上传成功 获取上传文件信息 
  // return $this->ajaxReturn(array('error'=>false,'msg'=>$info['savepath'].$info['savename'],'id'=>$id)); 
  $file = $dir . $info['savepath'] . $info['savename']; 
  $image = base64_encode(file_get_contents($file)); 
  $this->facevalid($no,$image); 
 
  $m = M('head'); 
  $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)); 
  } 
 
  return "采集照片成功"; 
 } 
}
public function facevalid($no,$image,$file){ 
 
 $options = array(); 
 
 $options["max_face_num"] = 2; 
 // $options["face_type"] = "LIVE"; 
 
 // $image=file_get_contents($file); 
 // $image=base64_encode($image); 
 // echo $image; 
 $imageType="BASE64"; 
  
 // 带参数调用人脸检测 
 $client=$this->init_face(); 
 $ret=$client->detect($image,$imageType,$options); 
 // $arr=$ret; 
 // print_r($ret); 
 // exit; 
 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 
   $group=$this->face_group(); 
   
   // echo $group; 
   // exit; 
   $faces=$client->faceGetlist($no,$group); 
   if($faces['error_code']>0){ 
   $client->addUser($image,'BASE64',$group,$no); 
   }else{ 
   $client->updateUser($image,'BASE64',$group,$no); 
   } 
   // echo '人脸检测完成,并已入库'; 
   // return true; 
   // $arr = array('error'=>false,'msg'=>'上传成功'); 
   
  }else{ 
  die('图片质量'); 
   // die('图片质量仅为:'.$face_probability.',上传失败'); 
  } 
  }else{ 
  die('人脸数量大于1'); 
  // die('人脸数量大于1,失败'); 
  } 
 }else{ 
  die('没有人脸'); 
  // die('没有人脸,失败'); 
 } 
 }

在前端我们需要在开发者工具里写js和wxml.

js代码如下:

const app = getApp() 
Page({ 
 data: { 
 sex: '女', 
 empty:true 
 }, 
 cancel: function () { 
 wx.redirectTo({ 
 url: '../face/face', 
 }) 
 }, 
 
 switch1Change: function (e) { 
 if (e.detail.value) { 
 this.setData({ sex: '男' }) 
 } else { 
 this.setData({ sex: '女' }) 
 } 
 }, 
 formSubmit: function (e) { 
 // console.log(e); 
 wx.request({ 
 url: 'http://*****.top/ppp/server/index.php/home/index/index', 
 data: e.detail.value, 
 method: 'POST', 
 header: { 
 'content-type': 'application/x-www-form-urlencoded' 
 }, 
 success: (res) => { 
 console.log(res.data); 
  
 if (res.data.error) { 
  wx.showToast({ 
  title: res.data.msg, 
  icon: 'none', 
  duration: 2000 
  }) 
 } else { 
  wx.showToast({ 
  title: res.data.msg, 
  icon: 'success', 
  duration: 2000 
  }) 
  
  setTimeout(function () { 
  wx.navigateTo({ 
  url: '../headimg/headimg?id=' + res.data.id, 
  }) 
  }, 2000) 
  
 } 
  
 } 
 
 }) 
 
 } 
  
})

上传图片js代码如下:

const app = getApp() 
function upload(that, id) { 
 if (that.data.files.length == 0) { 
 return; 
 } 
 wx.uploadFile({ 
 url: 'http://****.top/ppp/server/index.php/home/index/upload', //仅为示例,非真实的接口地址 
 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: data, 
 icon:'success', 
 duration:2000 
 }) 
 setTimeout(function () { 
 wx.navigateTo({ 
  url: '../index/index', 
 }) 
 }, 2000) 
 } 
 }) 
} 
Page({ 
 chooseImage: function (e) { 
 var that = this; 
 wx.chooseImage({ 
 count: 1, 
 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 
 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 
 success: function (res) { 
 console.log(res) 
 // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片 
 that.setData({ 
  files: res.tempFilePaths, 
 }); 
 } 
 }) 
 }, 
 //预览照片 
 previewImage: function () { 
 var current = e.target.dataset.src 
 wx.previewImage({ 
 current: current, 
 urls: this.data.imageList 
 }) 
 }, 
 
 cancel:function(){ 
 wx.redirectTo({ 
 url: '../index/index', 
 }) 
 }, 
 /** 
 * 页面的初始数据 
 */ 
 data: { 
 files: [], 
 options:null, 
 id:null, 
 }, 
 formSubmit:function(e){ 
 upload(this,this.data.id); 
 }, 
 /** 
 * 生命周期函数--监听页面加载 
 */ 
 onLoad: function (options) { 
 console.log(options); 
 this.setData({options:options}) 
 this.setData({ id: options.id }) 
 }, 
 
 /** 
 * 生命周期函数--监听页面初次渲染完成 
 */ 
 onReady: function () { 
 
 }, 
 
 /** 
 * 生命周期函数--监听页面显示 
 */ 
 onShow: function () { 
 
 }, 
 
 /** 
 * 生命周期函数--监听页面隐藏 
 */ 
 onHide: function () { 
 
 }, 
 
 /** 
 * 生命周期函数--监听页面卸载 
 */ 
 onUnload: function () { 
 
 }, 
 
 /** 
 * 页面相关事件处理函数--监听用户下拉动作 
 */ 
 onPullDownRefresh: function () { 
 
 }, 
 
 /** 
 * 页面上拉触底事件的处理函数 
 */ 
 onReachBottom: function () { 
 
 }, 
 
 /** 
 * 用户点击右上角分享 
 */ 
 onShareAppMessage: function () { 
 
 } 
})

 wxml代码如下:

<view class="weui-cells__title text">录入学生信息</view> 
<form bindsubmit="formSubmit"> 
 <view class="weui-cells weui-cells_after-title"> 
 <view class="weui-cell weui-cell_input"> 
 <view class="weui-cell__hd"> 
  <view class="weui-label">学号</view> 
 </view> 
 <view class="weui-cell__bd"> 
  <input class="weui-input" placeholder="请输入学号" value='1635050739' name="no" /> 
 </view> 
 </view> 
 <view class="weui-cell weui-cell_input weui-cell_vcode"> 
 <view class="weui-cell__hd"> 
  <view class="weui-label">姓名</view> 
 </view> 
 <view class="weui-cell__bd"> 
  <input class="weui-input" placeholder="请输入姓名" value='小苏' name="name" /> 
 </view> 
 </view> 
 <view class="weui-cell weui-cell_input"> 
 <view class="weui-label">性别</view> 
 <input class="weui-input" name='sex' value='{{sex}}'/> 
 <view class='weui-cell_ft'> 
  <switch checked bindchange='switch1Change'></switch> 
 </view> 
 </view> 
 <view class="weui-cell weui-cell_input weui-cell_vcode"> 
 <view class="weui-cell__hd"> 
  <view class="weui-label">年龄</view> 
 </view> 
 <view class="weui-cell__bd"> 
  <input class="weui-input" placeholder="请输入年龄" value='20' name="age" /> 
 </view> 
 </view> 
 </view> 
 <view class="weui-btn-area"> 
 <button class="weui-btn" type="primary" bindtap="showTopTips" formType="submit">注册</button> 
 <button class="weui-btn" type="default" bindtap='cancel'>返回上级</button> 
 </view> 
</form>

上传图片wxml代码如下:

<view class="page" xmlns:wx="http://www.w3.org/1999/xhtml"> 
<view class="weui-cells__title text">图像采集</view> 
<view class="weui-cells__title text">{{options.name}} {{options.no}}</view> 
<form bindsubmit="formSubmit"> 
<view class="page__bd"> 
 <view class="weui-cells"> 
  <view class="weui-cell"> 
  <view class="weui-cell__bd"> 
   <view class="weui-uploader"> 
   <view class="weui-uploader__hd"> 
    <view class="weui-uploader__title">图片上传</view> 
    <view class="weui-uploader__info">{{files.length}}/1</view> 
   </view> 
   <view class="weui-uploader__bd"> 
    <view class="weui-uploader__files" id="uploaderFiles"> 
    <block wx:for="{{files}}" wx:key="*this"> 
     <view class="weui-uploader__file" bindtap="previewImage" id="{{item}}"> 
     <image class="weui-uploader__img" src="{{item}}" mode="aspectFill"/> 
     </view> 
    </block> 
    </view> 
    <view class="weui-uploader__input-box"> 
    <view class="weui-uploader__input" bindtap="chooseImage"></view> 
    </view> 
   </view> 
   </view> 
  </view> 
  </view> 
 </view> 
 </view> 
 <view class="weui-btn-area"> 
  <button class="weui-btn" type="primary" form-type="submit">确认</button> 
  <button class="weui-btn" type="default" bindtap='cancel'>取消</button> 
 </view> 
 </form> 
</view>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
超强的IE背景图片闪烁(抖动)的解决办法
Sep 09 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
jquery实现的V字形显示效果代码
Oct 27 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
BootStrap selectpicker后台动态绑定数据的方法
Jul 28 Javascript
表格展示利器 Bootstrap Table实例代码
Sep 06 Javascript
angularjs实现天气预报功能
Jun 16 Javascript
vue-cli项目中使用echarts图表实例
Oct 22 Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
Aug 07 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 Javascript
微信小程序实现刷脸登录
May 25 #Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 #Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 #Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 #Javascript
Webpack中雪碧图插件使用详解
May 25 #Javascript
使用javascript做在线算法编程
May 25 #Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 #Javascript
You might like
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
JS 修改URL参数(实现代码)
2013/07/08 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
ES6的新特性概览
2016/03/10 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
python实现简单加密解密机制
2019/03/19 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
物理教师自荐信范文
2013/12/28 职场文书
学习考察心得体会
2014/09/04 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
四群教育工作总结
2015/08/10 职场文书
《植树问题》教学反思
2016/03/03 职场文书
协议书格式模板
2016/03/24 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书