云开发实战实战3--图片证件识别应用(代码资源后续上传)

实现项目展示

本文需要调用小程序接口中的OCR接口,具体接口使用请查看文档。
文章直通车

  • 识别证件的选择栏首页
    在这里插入图片描述

  • (例)点击识别印刷体,然后选择好要识别的文本数据上传
    在这里插入图片描述

  • 识别后的结果就会对象的数据类型形式返回,可以通过其他操作利用数据,在这里仅对所有识别结果进行展示。具体可返回数据看文件。

    在这里插入图片描述

注1:在进行本项目前,请确保您的小程序已经购买了OCR识别服务(免费额度为:100次/天),购买地址:https://developers.weixin.qq.com/community/servicemarket/detail/000ce4cec24ca026d37900ed551415

购买直通车
如果执行代码的时候报错为:返回值:{“errcode”:101003,“errmsg”:“not enough market quota hint: [ZRdLUa04902276] rid: 5f6afe82-0149d05d-4328453c”}
那么就是没有购买ocr服务

项目代码

1.云存储文件夹格式

注意图中给出的文件存储结构,需要与代码中给出的存储结构对应,可自行修改
在这里插入图片描述

2.部分代码展示(项目整体代码后续会上传至资源)

2.1 云函数代码

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async (event, context) => {

  if (event.select_btnname == "shenfenzheng") {
    //类型一:身份证识别
    try {
      const result = await cloud.openapi.ocr.idcard({
        type: 'photo',
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }
  } else if (event.select_btnname == "yinhangka") {
    //类型二:银行卡识别
    try {
      const result = await cloud.openapi.ocr.bankcard({
        type: 'photo',
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }
  } else if (event.select_btnname == "jiashizheng") {
    //类型三:驾驶证识别
    try {
      const result = await cloud.openapi.ocr.driverLicense({
        type: 'photo',
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }
  } else if (event.select_btnname == "xingshizheng") {
    //类型四:行驶证识别
    try {
      const result = await cloud.openapi.ocr.vehicleLicense({
        type: 'photo',
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }
  } else if (event.select_btnname == "yinshuati") {
    //类型五:印刷体识别
    try {
      const result = await cloud.openapi.ocr.printedText({
        type: 'photo',
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }
  } else if (event.select_btnname == "zhizhao") {
    //类型六:营业执照识别
    try {
      const result = await cloud.openapi.ocr.businessLicense({
        imgUrl: event.img
      })
      console.log(result)
      return result
    } catch (err) {
      console.log(err)
      return err
    }

  }
}

2.2 本地代码

<view wx:if="{{showbutton}}" class="all_btn">
  <view class="title">请选择您要内容的原件:</view>
  <button bindtap="btn_shibie" type="primary" data-type="shenfenzheng">识别身份证</button>
  <button bindtap="btn_shibie" type="primary" data-type="yinhangka">识别银行卡</button>
  <button bindtap="btn_shibie" type="primary" data-type="jiashizheng">识别驾驶证</button>
  <button bindtap="btn_shibie" type="primary" data-type="xingshizheng">识别行驶证</button>
  <button bindtap="btn_shibie" type="primary" data-type="yinshuati">识别印刷体</button>
  <button bindtap="btn_shibie" type="primary" data-type="zhizhao">识别营业执照</button>
</view>
<view wx:if="{{!showbutton}}" class="all_content">
  <image src="{{res_img}}">这里是图片位置</image>
  <view>
    <view>识别后的内容为:</view>
    <!-- 通过在text组件中设置selectable="true",来实现前端文字可以复制的功能 -->
    <view wx:for="{{res_content}}" wx:key="index" ><text selectable="true">{{item}}</text></view>
  </view>
  <button bindtap="back_select" type="primary">返回选择栏</button>
</view>
.all_btn button {
  margin-top: 30rpx;
}

.title {
  font-size: 60rpx;
}

.all_content{
  margin-top: 30rpx;
}
Page({
  data: {
    showbutton: true,//设置选择框是否展示参数
  },

  //步骤一:选择图片并上传图片,并携带文件数据类型
  btn_shibie(event) {
    console.log(event.currentTarget.dataset.type)
    //获取到前端按得是哪一个按钮
    let select_btnname = event.currentTarget.dataset.type
    wx.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['album', 'camera'],
      success: res => {
        const tempFilePaths = res.tempFilePaths
        // console.log("临时链接", tempFilePaths)
        this.uploadFile(tempFilePaths[0], select_btnname)
      }
    })

  },

  //步骤二:上传图片到云存储
  uploadFile(tempFile, select_btnname) {
    let timestamp = Date.parse(new Date());
    // console.log("当前时间戳", timestamp)
    wx.cloud.uploadFile({
      cloudPath: "实战资源/图片识别/" + select_btnname + "/" + timestamp + '.png',
      filePath: tempFile, // 文件路径
      success: res => {
        console.log("上传图片成功", res.fileID)
        this.getImgUrl(res.fileID, select_btnname)
      },
      fail: err => {
        console.log("上传图片失败", err)
      }
    })
  },

  // 步骤三:获取图片url,因为识别的接口只能识别网络格式的图片连接,所以需要获取到图片的网络连接。
  // Cloud.getTempFileURL(fileList: string[]): Promise<Object>用云文件 ID 换取真实链接,公有读的文件获取的链接不会过期,私有的文件获取的链接十分钟有效期。一次最多取 50 个
  //文档地址:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/storage/Cloud.getTempFileURL.html
  getImgUrl(fileid, select_btnname) {
    wx.cloud.getTempFileURL({
      fileList: [fileid],
      success: res => {
        let tempUrl = res.fileList[0].tempFileURL
        console.log("获取图片url成功", tempUrl)
        this.shibie(tempUrl, select_btnname)
      },
      fail: err => {
        console.log("获取图片url失败", err)
      }
    })
  },

  //步骤四:调用ocr接口获取到返回的内容数据,并显示到前端页面
  shibie(tempUrl, select_btnname) {
    let that = this
    wx.cloud.callFunction({
      name: "shibie",
      data: {
        img: tempUrl,
        select_btnname: select_btnname
      },
      success(res) {
        console.log("识别成功", res)
        if (select_btnname == "yinshuati") {//如果识别主体为印刷体,那么数据格式会为对象套对象的形式,需要特殊的数据处理,如果有其他需求大家可自行在这里修改
          let message = ""
          for (var i = 0; i < res.result.items.length; i++) {
            message += res.result.items[i].text
          }
          that.setData({
            res_img: tempUrl,
            showbutton: false,
            res_content: {message}//如果不加的话传输过去就是字符串,一个字符会占一行
          })
        } else {
          that.setData({
            res_img: tempUrl,
            showbutton: false,
            res_content: res.result
          })
        }

      },
      fail(res) {
        console.log("识别失败", res)
        wx.showToast({
          title: '图片识别失败,请重试',
          duration: 2000
        })
      }

    })
  },


  //返回文件类型选择栏
  back_select() {
    this.setData({
      showbutton: true,
    })
  },

  //获取当前时间,返回时间格式:2019-05-23 15:43:36
  getNowFormatDate: function () {
    var date = new Date();
    var seperator1 = "-";
    var seperator2 = ":";
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    if (month >= 1 && month <= 9) {
      month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
      strDate = "0" + strDate;
    }
    var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate +
      " " + date.getHours() + seperator2 + date.getMinutes() +
      seperator2 + date.getSeconds();
    return currentdate;
  },

})
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值