当前位置:Gxlcms > JavaScript > 微信小程序实现人脸识别

微信小程序实现人脸识别

时间:2021-07-01 10:21:17 帮助过:985人阅读

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

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

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

  1. public function upload($id=''){
  2. if(empty($id)){
  3. return false;
  4. }
  5. $no = M("student")->where("id={$id}")->getField('no');
  6. $dir = "./Upload/studentface/";
  7. if(!file_exists($dir)){
  8. mkdir($dir, 0777, true);
  9. }
  10. $upload = new \Think\Upload();// 实例化上传类
  11. $upload->maxSize = 3145728 ;// 设置附件上传大小
  12. $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
  13. $upload->rootPath = $dir; // 设置附件上传根目录
  14. $upload->savePath = ''; // 设置附件上传(子)目录
  15. $upload->saveName = $no;
  16. $upload->replace = true;
  17. $upload->autoSub = false;
  18. // 上传文件
  19. $info = $upload->uploadOne($_FILES['file']);
  20. if(!$info) {// 上传错误提示错误信息
  21. // return $this->ajaxReturn(array('error'=>true,'msg'=>$upload->getError()));
  22. return json_encode(array('error'=>true,'msg'=>$upload->getError()),JSON_UNESCAPED_UNICODE);
  23. }else{// 上传成功 获取上传文件信息
  24. // return $this->ajaxReturn(array('error'=>false,'msg'=>$info['savepath'].$info['savename'],'id'=>$id));
  25. $file = $dir . $info['savepath'] . $info['savename'];
  26. $image = base64_encode(file_get_contents($file));
  27. $this->facevalid($no,$image);
  28. $m = M('head');
  29. $data = $m->where("no='{$no}'")->find();
  30. if($data){
  31. //有数据,则更新
  32. $m->where("no='{$no}'")->save(array('base64'=>$image, 'path'=>$file));
  33. }else{
  34. $m->add(array('no'=>$no,'base64'=>$image,'path'=>$file));
  35. }
  36. return "采集照片成功";
  37. }
  38. }
  1. public function facevalid($no,$image,$file){
  2. $options = array();
  3. $options["max_face_num"] = 2;
  4. // $options["face_type"] = "LIVE";
  5. // $image=file_get_contents($file);
  6. // $image=base64_encode($image);
  7. // echo $image;
  8. $imageType="BASE64";
  9. // 带参数调用人脸检测
  10. $client=$this->init_face();
  11. $ret=$client->detect($image,$imageType,$options);
  12. // $arr=$ret;
  13. // print_r($ret);
  14. // exit;
  15. if($ret['error_code']==0){//有人脸
  16. $result=$ret['result'];
  17. $face_num=$result['face_num'];
  18. if(1==$face_num){//人脸数量为1
  19. $face_probability=$result['face_list'][0]['face_probability'];
  20. if(1==$face_probability){//可靠性为1
  21. $group=$this->face_group();
  22. // echo $group;
  23. // exit;
  24. $faces=$client->faceGetlist($no,$group);
  25. if($faces['error_code']>0){
  26. $client->addUser($image,'BASE64',$group,$no);
  27. }else{
  28. $client->updateUser($image,'BASE64',$group,$no);
  29. }
  30. // echo '人脸检测完成,并已入库';
  31. // return true;
  32. // $arr = array('error'=>false,'msg'=>'上传成功');
  33. }else{
  34. die('图片质量');
  35. // die('图片质量仅为:'.$face_probability.',上传失败');
  36. }
  37. }else{
  38. die('人脸数量大于1');
  39. // die('人脸数量大于1,失败');
  40. }
  41. }else{
  42. die('没有人脸');
  43. // die('没有人脸,失败');
  44. }
  45. }

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

js代码如下:

  1. const app = getApp()
  2. Page({
  3. data: {
  4. sex: '女',
  5. empty:true
  6. },
  7. cancel: function () {
  8. wx.redirectTo({
  9. url: '../face/face',
  10. })
  11. },
  12. switch1Change: function (e) {
  13. if (e.detail.value) {
  14. this.setData({ sex: '男' })
  15. } else {
  16. this.setData({ sex: '女' })
  17. }
  18. },
  19. formSubmit: function (e) {
  20. // console.log(e);
  21. wx.request({
  22. url: 'http://*****.top/ppp/server/index.php/home/index/index',
  23. data: e.detail.value,
  24. method: 'POST',
  25. header: {
  26. 'content-type': 'application/x-www-form-urlencoded'
  27. },
  28. success: (res) => {
  29. console.log(res.data);
  30. if (res.data.error) {
  31. wx.showToast({
  32. title: res.data.msg,
  33. icon: 'none',
  34. duration: 2000
  35. })
  36. } else {
  37. wx.showToast({
  38. title: res.data.msg,
  39. icon: 'success',
  40. duration: 2000
  41. })
  42. setTimeout(function () {
  43. wx.navigateTo({
  44. url: '../headimg/headimg?id=' + res.data.id,
  45. })
  46. }, 2000)
  47. }
  48. }
  49. })
  50. }
  51. })

上传图片js代码如下:

  1. const app = getApp()
  2. function upload(that, id) {
  3. if (that.data.files.length == 0) {
  4. return;
  5. }
  6. wx.uploadFile({
  7. url: 'http://****.top/ppp/server/index.php/home/index/upload', //仅为示例,非真实的接口地址
  8. filePath: that.data.files[0],
  9. name: 'file',
  10. formData: {
  11. 'id': id
  12. },
  13. success: function (res) {
  14. var data = res.data
  15. // var json = JSON.parse(data)
  16. console.log(data)
  17. wx.showToast({
  18. title: data,
  19. icon:'success',
  20. duration:2000
  21. })
  22. setTimeout(function () {
  23. wx.navigateTo({
  24. url: '../index/index',
  25. })
  26. }, 2000)
  27. }
  28. })
  29. }
  30. Page({
  31. chooseImage: function (e) {
  32. var that = this;
  33. wx.chooseImage({
  34. count: 1,
  35. sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  36. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  37. success: function (res) {
  38. console.log(res)
  39. // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
  40. that.setData({
  41. files: res.tempFilePaths,
  42. });
  43. }
  44. })
  45. },
  46. //预览照片
  47. previewImage: function () {
  48. var current = e.target.dataset.src
  49. wx.previewImage({
  50. current: current,
  51. urls: this.data.imageList
  52. })
  53. },
  54. cancel:function(){
  55. wx.redirectTo({
  56. url: '../index/index',
  57. })
  58. },
  59. /**
  60. * 页面的初始数据
  61. */
  62. data: {
  63. files: [],
  64. options:null,
  65. id:null,
  66. },
  67. formSubmit:function(e){
  68. upload(this,this.data.id);
  69. },
  70. /**
  71. * 生命周期函数--监听页面加载
  72. */
  73. onLoad: function (options) {
  74. console.log(options);
  75. this.setData({options:options})
  76. this.setData({ id: options.id })
  77. },
  78. /**
  79. * 生命周期函数--监听页面初次渲染完成
  80. */
  81. onReady: function () {
  82. },
  83. /**
  84. * 生命周期函数--监听页面显示
  85. */
  86. onShow: function () {
  87. },
  88. /**
  89. * 生命周期函数--监听页面隐藏
  90. */
  91. onHide: function () {
  92. },
  93. /**
  94. * 生命周期函数--监听页面卸载
  95. */
  96. onUnload: function () {
  97. },
  98. /**
  99. * 页面相关事件处理函数--监听用户下拉动作
  100. */
  101. onPullDownRefresh: function () {
  102. },
  103. /**
  104. * 页面上拉触底事件的处理函数
  105. */
  106. onReachBottom: function () {
  107. },
  108. /**
  109. * 用户点击右上角分享
  110. */
  111. onShareAppMessage: function () {
  112. }
  113. })

 wxml代码如下:

  1. <view class="weui-cells__title text">录入学生信息</view>
  2. <form bindsubmit="formSubmit">
  3. <view class="weui-cells weui-cells_after-title">
  4. <view class="weui-cell weui-cell_input">
  5. <view class="weui-cell__hd">
  6. <view class="weui-label">学号</view>
  7. </view>
  8. <view class="weui-cell__bd">
  9. <input class="weui-input" placeholder="请输入学号" value='1635050739' name="no" />
  10. </view>
  11. </view>
  12. <view class="weui-cell weui-cell_input weui-cell_vcode">
  13. <view class="weui-cell__hd">
  14. <view class="weui-label">姓名</view>
  15. </view>
  16. <view class="weui-cell__bd">
  17. <input class="weui-input" placeholder="请输入姓名" value='小苏' name="name" />
  18. </view>
  19. </view>
  20. <view class="weui-cell weui-cell_input">
  21. <view class="weui-label">性别</view>
  22. <input class="weui-input" name='sex' value='{{sex}}'/>
  23. <view class='weui-cell_ft'>
  24. <switch checked bindchange='switch1Change'></switch>
  25. </view>
  26. </view>
  27. <view class="weui-cell weui-cell_input weui-cell_vcode">
  28. <view class="weui-cell__hd">
  29. <view class="weui-label">年龄</view>
  30. </view>
  31. <view class="weui-cell__bd">
  32. <input class="weui-input" placeholder="请输入年龄" value='20' name="age" />
  33. </view>
  34. </view>
  35. </view>
  36. <view class="weui-btn-area">
  37. <button class="weui-btn" type="primary" bindtap="showTopTips" formType="submit">注册</button>
  38. <button class="weui-btn" type="default" bindtap='cancel'>返回上级</button>
  39. </view>
  40. </form>

上传图片wxml代码如下:

  1. <view class="page" xmlns:wx="http://www.w3.org/1999/xhtml">
  2. <view class="weui-cells__title text">图像采集</view>
  3. <view class="weui-cells__title text">{{options.name}} {{options.no}}</view>
  4. <form bindsubmit="formSubmit">
  5. <view class="page__bd">
  6. <view class="weui-cells">
  7. <view class="weui-cell">
  8. <view class="weui-cell__bd">
  9. <view class="weui-uploader">
  10. <view class="weui-uploader__hd">
  11. <view class="weui-uploader__title">图片上传</view>
  12. <view class="weui-uploader__info">{{files.length}}/1</view>
  13. </view>
  14. <view class="weui-uploader__bd">
  15. <view class="weui-uploader__files" id="uploaderFiles">
  16. <block wx:for="{{files}}" wx:key="*this">
  17. <view class="weui-uploader__file" bindtap="previewImage" id="{{item}}">
  18. <image class="weui-uploader__img" src="{{item}}" mode="aspectFill"/>
  19. </view>
  20. </block>
  21. </view>
  22. <view class="weui-uploader__input-box">
  23. <view class="weui-uploader__input" bindtap="chooseImage"></view>
  24. </view>
  25. </view>
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. <view class="weui-btn-area">
  32. <button class="weui-btn" type="primary" form-type="submit">确认</button>
  33. <button class="weui-btn" type="default" bindtap='cancel'>取消</button>
  34. </view>
  35. </form>
  36. </view>

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

人气教程排行