微信小程序实现OCR扫描识别

这篇具有很好参考价值的文章主要介绍了微信小程序实现OCR扫描识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在小程序还发过程中,经常会遇到对证件(身份证、驾驶证、营业执照)的扫描识别认证功能;这里我根据自己的经历借鉴总结一下相关的方法;

一、第三方插件:OCR支持

1、添加第三方插件

第一步需要在微信小程序后台添加第三方插件,设置-第三方设置-插件管理,输入**ocr支持**搜索添加就可以了;
微信小程序实现OCR扫描识别

2、购买识别次数

OCR支持插件添加成功之后需要到开放社区购买识别次数,可以根据自己公司的业务需求量购买;(个人觉得有点贵)

3、使用

在 app.json 中声明引入插件,version 使用最新版本,provider 是OCR支持的 AppID;

 "plugins": {
    "ocr-plugin": {
      "version": "3.1.1",
      "provider": "wx4418e3e031e551be"
    }
  }

在使用OCR支持的页面 json 中引入组件

{
  "usingComponents": {
    "ocr-navigator": "plugin://ocr-plugin/ocr-navigator"
  }
}

页面使用

//wxml
<ocr-navigator bind:onSuccess="success" certificateType="idCard" opposite="{{false}}">
  <button type="primary">身份证正面识别</button>
</ocr-navigator>
<ocr-navigator bind:onSuccess="success" certificateType="idCard" opposite="{{true}}">
  <button type="primary">身份证反面识别</button>
</ocr-navigator>
//js
Page({
	data:{
	    name:'',
	    id:''
	},
	success(e){
		console.log(e.detail)
	    this.setData({
	      name:e.detail.name.text,
	      id:e.detail.id.text
	    })
	}
})

微信小程序实现OCR扫描识别
注意:certificateType 类型不同属性也不同可以参考:OCR支持开发文档

二、百度OCR

1、申请百度AI开放平台账号

申请地址:http://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpingtai|pu:title|ci:|kw:10005792

2、创建应用获取密钥

开放能力-文字识别 ,这里有身份证、银行卡、营业执照、护照、出生证明等识别服务;
微信小程序实现OCR扫描识别
微信小程序实现OCR扫描识别
按照个人需要填写信息,创建应用之后,在应用列表可以查看对应的 API Key 、Secret Key、AppID 等信息;

3、使用

1、配置合法域名

在使用之前,我们需要将百度OCR接口域名配置在微信小程序后台的合法域名中(https://aip.baidubce.com);

2、接口分析(身份证)

接口、入参参考:技术文档

3、调用

获取身份证图片

// 点击扫证,可拍照、可选择本机图片
getImage(){
 let that = this
 wx.showActionSheet({
   itemList: ['拍照','相册'],
   success(res){
     let index = res.tabIndex;
     if(index == 0){
      that.gotophoto();
     }else{
      that.getAlbum();
     }
   }
 })
},
//从相册选择图片
getAlbum(){
	let that = this;
	wx.chooseImage({
		count: 1,
		sourceType: ['album'],
		success:function(res){
			let path = res.tempFilePaths[0];
			that.getBase64Path(path).then(base64=>{
				that.ocrCard(base64).then(res=>{
					//这里就是扫描的结果
					console.log(res);
				})
			});
		}
	})
},
//本地转化为base64编码
getBase64Path(path){
	return new Prmise((resolve,reject)=>{
		wx.getFileSystemManager().readFile({
	      filePath: path,
	      encoding: 'base64',
	      success: function (res) {
	        resolve(res.data);
	      },
	    })
	})
}

调用身份证OCR识别之前需要先获取 access_token

//获取access_token
getToken(){
	 return new Promise((resolve,reject)=>{
      let appKey = 'xxxxx';
      let secretKey  = 'xxxxx';
      let url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${appKey}&client_secret=${secretKey}`;
      wx.request({
        url: url,
        method:'POST',
        dataType:'json',
        header:{
          'content-type': 'application/json; charset-UTF-8'
        },
        success(res){
          resolve(res);
        },
        fail(err){
          reject(err);
        }
      })
    })
},

识别身份证

//识别图片
ocrCard(data){
    return new Promise((resolve,reject)=>{
      this.getToken().then(res=>{
        let token = res.data.access_token
        let url = `https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=${token}`;
        wx.request({
          url: url,
          method:'POST',
          header:{
            'Content-Type': 'application/x-www-form-urlencoded'
          },
          data:{
            image:data,
            id_card_side:'front'
          },
          success(res){
            resolve(res);
          },
          fail(err){
            reject(err);
          }
        })
      })
    })
  }

上面就是照片选择到身份证OCR识别的整个过程;关于 access_token 也可以在页面加载的时候获取一次,然后将 access_token 缓存在本地,这样每次获取的时候需要先判断 access_token 是否过期;

三、拍照、照片裁剪

对于拍照的照片,有些时候我们可能需要对其进行裁剪;
1、跳转到拍照页面

gotophoto(){
  wx.navigateTo({
    url: '/pages/photo/photo'
  })
}

2、拍照页面

<camera type="2d" device-position="back" resolution="high" style="width: 100%; height: 100vh;">
  <cover-view>
  <!-- 拍照后的回显图片,必须在裁剪蒙层上面,不然不显示 -->
    <cover-image wx:if="{{showPic}}" src="{{image}}"></cover-image>
    <!-- 拍照蒙层,按照这个裁剪 -->
    <cover-image src="http://print.jiaynet.cn/icons/zhezhao.png"></cover-image>
  </cover-view>
  <!-- 拍照按钮 -->
  <cover-view style="color: #fff; width: 100%; position: fixed; left:0; bottom: 40rpx;">
    <cover-view bindtap="takePhotoAction" style="width: 100%; text-align: center;">拍照</cover-view>
  </cover-view>
</camera>
<!-- 这里的宽高一定不要忘记设置 -->
<canvas style='width:{{width}}px; height:{{height}}px; opacity: 0;' canvas-id="mycanvas"></canvas>

3、拍照

data: {
  width:0,//设备宽度
  height:0,//设备高度
  image:'',
  showPic:false
},
takePhotoAction(){
   let that = this;
   let ctx = wx.createCameraContext();
   ctx.takePhoto({
     quality:'high',
     success(res){
       that.loadTempImagePath(res.tempImagePath)
     }
   })
 },
 //剪切图片
  loadTempImagePath(path){
    let that = this;
    //获取设备宽高信息
    wx.getSystemInfo({
      success: (res) => {
        that.setData({
          width:res.screenWidth,
          height:res.screenHeight
        })
        let imgX = 0.1*that.data.width;
        let imgY = 0.25*that.data.height;
        let imgWidth = 0.8*that.data.width;
        let imgHeight = 0.25*that.data.height;
        //获取图片信息
        wx.getImageInfo({
          src: path,
          success(res){
            const canvas = wx.createCanvasContext('mycanvas', that);
            //将图片放到画布上
            canvas.drawImage(path,0,0,that.data.width,that.data.height);
            //截取图片
            canvas.draw(false,setTimeout(()=>{
              wx.canvasToTempFilePath({
                canvasId: 'mycanvas',
                x: 50, //画布x轴起点
                y: 200, //画布y轴起点
                width: imgWidth, //画布宽度
                height: imgHeight, //画布高度
                destWidth: imgWidth, //输出图片宽度
                destHeight: imgHeight, //输出图片高度
                success(res){
                  that.setData({
                    image:res.tempFilePath,
                    showPic:true
                  })
                }
              })
            }),1000)
          }
        })
      },
    })
  }

这里的重点是对截图框位置的计算,可以根据自己的需求来设计宽高;

4、由于 createCanvasContext 在 2.9.0 开始停止维护,官网推荐使用 Canvas 代替

//wxml
<camera type="2d" device-position="back" resolution="high" style="width: 100%; height: 100vh;">
  <cover-view>
  <!-- 拍照后的回显图片,必须在上面,不然不显示 -->
    <cover-image style="position: absolute; top: 0; left: 0; width: 348px; height: auto;" wx:if="{{showPic}}" src="{{image}}"></cover-image>
    <!-- 拍照蒙层,按照这个裁剪 -->
    <cover-image src="http://print.jiaynet.cn/icons/zhezhao.png"></cover-image>
  </cover-view>
  <!-- 拍照按钮 -->
  <cover-view style="color: #fff; width: 100%; position: fixed; left:0; bottom: 40rpx;">
    <cover-view bindtap="takePhotoAction" style="width: 100%; text-align: center;">拍照</cover-view>
  </cover-view>
</camera>
<!--  -->
<canvas type="2d" id="mycanvas"></canvas>
//js
 takePhotoAction(){
    let that = this;
    let ctx = wx.createCameraContext();
    ctx.takePhoto({
      quality:'high',
      success(res){
        that.setData({
          image:res.tempImagePath
        })
        wx.createSelectorQuery()
          .select('#mycanvas')
          .fields({
            node: true,
            size: true
          }, (res) => {
            const canvas = res.node
            const ctx2 = canvas.getContext('2d');
            that.init(ctx2, canvas)
          })
          .exec()
      }
    })
  },
  init(ctx, canvas) {
    let img = canvas.createImage()
    img.src = this.data.image;
    img.onload = (e) => {
      let c_x = img.width * 0.05
      let c_w = img.width * 0.89
      let c_y = img.height * 0.365
      let c_h = img.height * 0.12
      //截取图片指定部分并绘制到canvas
      ctx.drawImage(img, c_x, c_y, c_w, c_h, 0, 0, 300, 300 * (c_h / c_w))//width固定为300,按比例计算出height
      //将canvas内容保存为图片
      wx.canvasToTempFilePath({
        canvas: canvas,
        // x: 50, //画布x轴起点
        // y: 280, //画布y轴起点
        width:  335, //画布宽度
        height: 216, //画布高度
        // destWidth: 335, //输出图片宽度
        // destHeight: 216, //输出图片高度
        fileType: 'png',
        success: (res) => {
          this.setData({
            image:res.tempFilePath,
            showPic:true
          })
           //将图片保存到本地相册
          wx.saveImageToPhotosAlbum({
            filePath: res.tempFilePath,
          })
        },
        fail: (res) => {
          console.log(res)
        }
      })
    }
    img.onerror = (e) => {
      console.error('err:', e)
    }
  }

由于使用 canvas 时的 drawImage 参数比较难理解,请参考:canvas的drawImage方法参数详解文章来源地址https://www.toymoban.com/news/detail-425550.html

到了这里,关于微信小程序实现OCR扫描识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】使用 wx.scanCode方法实现扫描二维码的功能

    在微信小程序中,你可以使用 wx.scanCode 方法实现扫描二维码的功能。以下是一个简单的示例代码: 在上述代码中,我们使用 wx.scanCode 方法来调用扫描二维码的功能。当扫描成功时, success 回调函数将会被调用,而当扫描失败时, fail 回调函数将会被调用。通过 res.result 可以

    2024年02月15日
    浏览(54)
  • OpenCV(九)--文字扫描OCR识别

    步骤:边缘检测+计算轮廓+变换+OCR OCR识别 识别结果: 完整代码

    2024年01月18日
    浏览(42)
  • 微信小程序登录过程中,实现数据解密操作

    解密后的decrypt 对象中就包含了用户信息。

    2024年02月12日
    浏览(30)
  • 【微信小程序调用百度API实现图像识别功能】----项目实战

    本章主要讲述: 如何更快的上手小程序 如何搭建一个页面以及跳转到另一个页面 如何调用百度API接口实现图像识别技术 如何在微信小程序的后台添加合法域名        私信获取源码,有问题可以关注留言或私信,计算机毕业设计(小程序,网页设计,数据库,php开发等) 目录

    2024年02月09日
    浏览(66)
  • 如何微信小程序实现长按识别图片二维码

    如何微信小程序实现长按识别图片二维码

    2024年01月23日
    浏览(70)
  • 【微信小程序调用百度API实现图像识别实战】----前后端分离

    前言:基于之前发布的文章【微信小程序调用百度API实现图像识别功能】----项目实战稍微进行了升级改进,主要新增了后端,数据库,实现对于虫害识别,返回防治建议等信息。 本文主要讲述: 如何创建数据库 如何连接数据库 如何创建后端服务 如何调用后端服务 目录  一

    2024年04月25日
    浏览(49)
  • uniapp开发微信小程序实现语音识别,使用微信同声传译插件,

    第一步:在微信小程序管理后台:“设置”-》“第三方设置”-》“插件管理”中添加插件。 但是这个地方,没有搜索到插件,就到微信服务市场 搜索到以后添加到需要的小程序里面,然后返回管理中心查看,就可以看到了 第二步:在配置文件中引入插件 第三步:在需要使

    2024年02月05日
    浏览(52)
  • uniapp开发微信小程序,使用微信同声传译插件,实现语音识别输入文本

    第一步:现在微信小程序管理后台:“设置”-》“第三方设置”-》“插件管理”中添加插件。 但是这个地方,没有搜索到插件,就到微信服务市场去搜微信服务市场  搜索到以后添加到需要的小程序里面,然后返回管理中心查看,就可以看到了 第二步:在配置文件中引入插

    2024年02月09日
    浏览(70)
  • 微信小程序扫描蓝牙及操作(低功耗)蓝牙数据(全套流程)

    扫描蓝牙首先需要打开手机上的蓝牙。iOS只需打开蓝牙即可开始扫描蓝牙;Android需要打开蓝牙及位置信息才可以开始扫描蓝牙。下面的代码可以在扫描之前使用,用来检查是否已经很打开蓝牙及位置信息 官方地址https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.stopBl

    2024年02月09日
    浏览(62)
  • 微信小程序扫描普通二维码跳转到小程序指定页面

    二维码就相当于是一个链接 相当于我们点击一个链接跳转到另一个页面 只不过这里是扫码的形式 1、首先我们需要在微信公众平台的开发管理——开发设置,找到(扫普通链接二维码打开小程序),点击添加,会出现下面的页面,配置好之后点击保存就行了 2、配置好之后我

    2024年02月11日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包