专栏首页Node开发图片文字识别(2)

图片文字识别(2)

上一篇文章封装了request库用来发起http请求,然后获取了用户操作凭证access_token。上篇文章主要对百度AI文字识别接口最基础的通用文字以及手写文字图片进行了接入识别,本篇文章我们来接着看几个实用性比较强的文字识别接口。百度AI接口对接挺容易的,签名加密都没有涉及到。唯一的缺点就是接口文档写的不够完善,容易遇见坑。上篇文章只介绍了第一个实用性接口:身份证识别接口,我们当时只以正面照做了示例,该接口不支持图片url,而是需要将图片数据以BASE64编码。我们直接贴关键代码:

可能细心的读者会发现我代码好像变了!和上篇文章的代码改动非常大,我们先看看上节课对图片BASE64编码实现代码:

var image = fs.readFileSync('./../public/images/begin.jpg').toString('base64');

可以发现我上篇文章实际上是将图片放在项目public静态文件夹下,然后使用NodeJS异步读取文件去读取图片数据,然后进行BASE64编码。但是在实际开发中这个逻辑是非常不合理的!不合理在哪呢?主要有以下两点:

只能识别项目本地照片,往往不符合需求
如果项目本地存放过多照片,可能会大大降低效率

所以可以看到我对接口做了适当的修改,前端通过传参图片url,然后通过http.get()去不断缓冲图片数据,然后将数据转化为一个Buffer对象,最后再进行BASE64编码。

我们可以看下修改过后的接口效果:

(图片来源于百度,假数据)

可以看到我们传入图片url,最后可以转化为BASE64编码再调用接口可以成功解析到用户身份证文字信息。但是这样操作优缺点在哪呢:

优点:相对于读取本地照片,用户可以传入指定图片的url进行缓冲数据再进
      行编码为BASE64,可以达到文字识别用户想要上传的图片。
      
缺点:用户如果想要文字识别手机电脑本地的照片就会特别麻烦,需要先将照
      片上传到服务器,(比如七牛图片服务器),然后再将图片url传入接口去
      进行解析,大大降低了用户体验。

所以这样的方案其实也是不合理的,那怎样去修改方案才会更合理呢?其实我觉得有两种方案可以进行选择:

1.如果图片只需要解析不需要进行保存,前端提供用户选择本地图片操作,
  直接编码为BASE64,然后直接将BASE64编码传递给后端,后端直接调用
  接口解析图片文字信息。

2.如果图片需要进行保存,可以前端将图片转化为binary格式,后端先将图
  片上传到服务器或者直接传到对象存储oss,然后获得图片路径,使用现
  在的方法加载缓冲数据,进行BASE64编码最后调用接口解析图片文字信息。

这部分我没有去继续优化了,有兴趣的可以结合我之前上传图片的文章:Node上传文件(1) 去继续进行优化接口。

那么我们讲解完现在接口实现的具体思路,我们可以着手来实现几个实用性接口看下效果。首先我们先来看看第一个实用性接口:银行卡照片识别。

银行卡照片识别

这个接口的用处看接口名就可以知道了:识别银行卡并返回卡号、有效期、发卡行和卡片类型。首先我们先看看文档对于接口的具体说明:

这个接口请求参数很简单明了,携带access_token进行鉴权,image为图片缓冲数据的BASE64编码。接下来贴下关键代码:

我们可以测试下传入银行卡照片是否能解析出银行卡的有效信息:

可以看到传入url可以成功解析出银行卡照片上面所携带的基本信息。我们直接贴下返回参数文档说明:

营业执照识别

顾名思义这个接口就是识别营业执照的照片:可以识别营业执照,并返回关键字段的值,包括单位名称、类型、法人、地址、有效期、证件编号、社会信用代码等。首先一样直接贴下文档请求参数的说明:

必传参数一样固定有access_token以及image。有两个选传参数可以视情况进行传参。接下来贴下关键代码:

我直接百度找一个营业执照链接进行测试接口效果:

可以看到营业信息成功解析了,返回信息过多所以我就没有全部进行截图。我贴下返回参数文档说明:

护照识别

支持对中国大陆居民护照的资料页进行结构化识别,包含国家码、姓名、姓名拼音、性别、护照号、出生日期、出生地点、签发日期、有效期至、签发地点。先贴下请求参数文档说明:

请求参数也很简洁,只需要携带access_token鉴权,以及图片进行BASE64编码后的image参数。我们贴下关键代码:

我们直接测试一下接口效果:

直接贴上返回参数文档说明,可以自行去理解参数含义:

表格文字识别(内含两个接口)

自动识别表格线及表格内容,结构化输出表头、表尾及每个单元格的文字内容。 本接口为异步接口,分为两个API提交请求接口、获取结果接口。下面分别描述两个接口的使用方法。

提交请求接口

直接贴下请求参数文档说明:

本接口一样还是两个必须参数:access_token以及image。我们贴下关键代码:

我们可以看下请求接口关于返回参数的文档说明:

也就是说请求结果传入image,会返回一个request_id,然后我们可以在下一个结果通过传入request_id来获取解析结果。现在我们先看看接口效果:

可以看到我们成功获取到request_id。接下来我们看看第二个接口获取表格解析结果。首先先贴下请求参数说明:

通过上一步取到的request_id以及access_token可以获取解析结果。返回结果我们通过传参result_type指定返回结果的类型为excel或者json格式。接下来直接在第一步的代码进行改进增加第二步操作:

我们在第一次调用

PostHelper.baseRequestBase(url, param, function(err, data))

发起请求返回request_id,然后携带request_id再次发起请求获取解析表格结果。我们可以看下结果返回结果:

可以看到表格图片中的数据成功被解析出来了。当然我们选择将第二次请求携带的参数result_type改成excel,接口就会将表格图片中的数据解析成一个excel表格并返回链接。我们可以测试下效果:

可以看到接口返回excel表格的下载链接。这样有一个好处就是比如我们数据库设计表截个数据表的图,扔进接口里面就可以自动生成一个表格链接供我们进行下载,省却了我们制作数据表的时间和精力。

相对比较实用的接口且免费的接口基本有以上几个,其实百度AI提供了一系列接口。但是我这里就不准备一一介绍了,有兴趣可以自行查看百度AI文字识别文档:

https://ai.baidu.com/docs#/OCR-API/87932804

其实业务开发过程如果适当的引入人脸识别,文字识别等AI接口确实可以很大程度提升用户的体验,更大程度的留住潜在的客户。而且百度AI还提供了一系列需要申请权限的接口,很大成都方便了我们的开发,我们不必去追究底层是如何识别图片中的文字的,就可以快速接入API识别我们需要的功能。

本文分享自微信公众号 - 程序猿周先森(zhanyue_org),作者:逆月翎

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图片文字识别实现(1)

    上次使用百度AI接口开发过人脸识别接口,今天腾出时间所以去看了看文字识别的技术接口文档。文字识别一样有SDK可以接入快速开发,但是我不准备使用SDK接入,本篇文...

    逆月翎
  • 微信JSAPI支付

    最近接到新的需求,需要在公众号引入微信支付。之前微信支付方式使用过Native当面付以及H5支付。Native支付有两个弊端所在:

    逆月翎
  • 前后端分离之交互(1)

    之前写过一篇文章讲到我对目前技术发展趋势的一些看法:我理解的技术发展趋势,里面其实有提到,现在比较流行MVVM,越来越多的公司开始采用前后端分...

    逆月翎
  • Api接口设计需要考虑到de因素呢

    设计接口是一件容易的事,也是件困难的事。设计接口每个人都会,每个人都能设计,也由此产生了各种各样的理念的接口。工作这么多年,我也很有感悟。很多人会说,设计接口多...

    php007
  • [日常] 编写HTTP接口文档

    一、什么是接口文档? 在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到...

    陶士涵
  • Java编程思想精粹(九)-接口

    尽管你的第一想法是创建接口,但对于构建具有属性和未实现方法的类来说,抽象类也是重要且必要的工具。毕竟你不可能总是使用纯粹的接口。

    JavaEdge
  • Java编程思想精粹(On Java8)(十)-接口

    尽管你的第一想法是创建接口,但对于构建具有属性和未实现方法的类来说,抽象类也是重要且必要的工具。 你不可能总是使用纯粹的接口。

    JavaEdge
  • 多态的灵魂,面向接口的程序设计,这才是你该懂得的接口

    比如,显示器中封装了很多电子元器件,这些元器件连接在一起为显示器的正常共工作提供支持,那显示器如何与外界的其他设备(如电脑主机、外放音响、耳机等设备)通信交互呢...

    老夫编程说
  • 「JAVA」Java面向对象之面向接口编程,细节都在这里了

    比如,显示器中封装了很多电子元器件,这些元器件连接在一起为显示器的正常共工作提供支持,那显示器如何与外界的其他设备(如电脑主机、外放音响、耳机等设备)通信交互呢...

    老夫编程说
  • 接口测试

    模拟客户端向服务器发送请求,服务器接收请求后对相应的请求做处理并向客户端返回响应结果,客户端接收结果的一个过程

    zx钟

扫码关注云+社区

领取腾讯云代金券