腾讯Ocr文字识别
简述
上篇文章记录了百度Ocr的两种模式用法,接下来这篇文章开始记录腾讯Ocr的使用方法。腾讯Ocr的通用印刷体识别模式使用比较简单,直接接入sdk即可,但手写体的识别相对比较麻烦,需要自己post表单(也可能是能用sdk的,但我是没有找到)
通用文字识别
1.直接在Android Studio的app->build.gradle->dependencies中添加:
implementation 'com.qcloud:qcloud-image-sdk:2.3.6'
2.初始化识别程序:
ImageClient imageClient = new ImageClient(APPID, SecretId, SecretKey,
ImageClient.NEW_DOMAIN_recognition_image_myqcloud_com);
其中APPID、SecretId、SecretKey这些和百度一样是需要去注册获取的,具体获取方式没什么难度就不详说(点击前往腾讯AI开放平台)。最后一个参数是服务器域名,默认使用新域名,也就是:
ImageClient.NEW_DOMAIN_recognition_image_myqcloud_com
如果是老用户,修改为以下域名:
ImageClient.OLD_DOMAIN_service_image_myqcloud_com
3.开始进行文字识别:
GeneralOcrRequest request = new GeneralOcrRequest("", getBitmapFile(mBitmap));
try {
String orcResult = imageClient.generalOcr(request);
} catch (AbstractImageException e) {
e.printStackTrace();
}
GeneralOcrRequest的第一个参数是bucketName实际上没什么用(官方说是遗留字段,至少对我来说没什么用,不知道实际上是什么样子),可以直接用空字符填充,第二个参数是File,上面代码是我项目中从bitmap获取file文件的写法。代码中的orcResult即为文字识别结果,返回的是一段json数据,需要自己去转换,推荐使用fastjson框架。
手写体文字识别
1.本项目中使用的是okhttp3框架进行get-post操作,因此是okhttp3框架的代码写法,实际使用因框架的不同而不同,但发送的数据都一样。如果要识别的图片是一个url地址,则用以下的post数据形式:
POST /ocr/handwriting HTTP/1.1
Authorization: 自己生成签名
Host: recognition.image.myqcloud.com
Content-Length: 自定义长度 ps:有使用者称加上这个会报错,本人使用的时候是不加上Content-Length的
Content-Type: application/json
{
"appid":"你的appid",
"bucket":"",
"url":"图片url地址"
}
如果识别本地图片,则使用以下post数据形式(本人就是使用本地图片,因此之后的代码是用这种方式):
POST /ocr/handwriting HTTP/1.1
Authorization: 自己生成签名
Host: recognition.image.myqcloud.com
Content-Length: 自定义长度 ps:同上
Content-Type: multipart/form-data;boundary=--------------acebdf13572468
----------------acebdf13572468
Content-Disposition: form-data; name="appid";
你的appid
----------------acebdf13572468
Content-Disposition: form-data; name="bucket";
空串
----------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="test.jpg"
Content-Type: image/jpeg
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
----------------acebdf13572468--
上面这些数据让不懂multipart/form-data格式的童鞋来说,看上去就眼花缭乱,不知道该怎么用,但是不要紧,实际上我们根本不需要写这么多东西,这就是使用http框架的好处,它已经帮我们做了很多事。
2.首先需要自己生成签名:
public class Sign {
/**
* 生成 Authorization 签名字段
*
* @param appId
* @param secretId
* @param secretKey
* @param bucketName
* @param expired
* @return
* @throws Exception
*/
public static String appSign(long appId, String secretId, String secretKey, String bucketName,
long expired) throws Exception {
long now = System.currentTimeMillis() / 1000;
int rdm = Math.abs(new Random().nextInt());
String plainText = String.format("a=%d&b=%s&k=%s&t=%d&e=%d&r=%d", appId, bucketName,
secretId, now, now + expired, rdm);
byte[] hmacDigest = HmacSha1(plainText, secretKey);
byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
plainText.getBytes().length);
return Base64Encode(signContent);
}
/**
* 生成 base64 编码
*
* @param binaryData
* @return
*/
public static String Base64Encode(byte[] binaryData) {
String encodedstr = Base64.getEncoder().encodeToString(binaryData);
return encodedstr;
}
/**
* 生成 hmacsha1 签名
*
* @param binaryData
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(byte[] binaryData, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secretKey);
byte[] HmacSha1Digest = mac.doFinal(binaryData);
return HmacSha1Digest;
}
/**
* 生成 hmacsha1 签名
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(String plainText, String key) throws Exception {
return HmacSha1(plainText.getBytes(), key);
}
}
上面代码可以直接复制使用,获取签名就是调用appSign这个方法,方法的前四个参数就是之前说的三个值,就不多说了,最后一个参数是时间值,也就是从现在开始,授权多久的时间,单位是秒。获取签名:
String sign = "";
try {
sign = Sign.appSign(APPID, SECRETID, SECRETKEY, "", 2592000);
} catch (Exception e) {
e.printStackTrace();
}
3.请求头和请求体:
File file = getBitmapFile(mBitmap);
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", file.getAbsolutePath(), RequestBody.create(MediaType.parse("image/png"), file))
.addFormDataPart("appid", APPID)
.build();
Request request = new Request.Builder()
.header("host", "recognition.image.myqcloud.com")
.addHeader("authorization", sign)
.url("https://recognition.image.myqcloud.com/ocr/handwriting")
.post(requestBody)
.build();
重点要注意第一个addFormDataPart方法,第一个参数是“image”无需改动,第二个参数是文件的路径,第三个参数是文件的类型,第四个参数就是file本身。其他的设置项都是默认的,不需要修改。
4.开始post并返回结果:
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("TAG", "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
JSONObject jsonObject=new JSONObject();
jsonObject= JSON.parseObject(response.body().string());
Log.i("TAG", "tencent handwrite: " +jsonObject.toString());
}
});
返回的结果也是json数据体,需要自己解析。
两种模式相互比较和与百度比较
印刷体模式操作比较简单,毕竟已经封装好了,手写体需要自己post数据比较麻烦。从识别率上,这两种方式都差别不大。在我的测试样例中,百度的高精度印刷体模式识别率是最好的,其次到百度的手写体模式,腾讯的两种识别率都不是很好。
总结
图片识别目前使用百度的sdk准确率比较高。但如果识别的是印刷体,四种都差不多,腾讯印刷体使用最为简单。但这四种都不是很符合本人项目的需要,因此抛弃了光学字符识别,找了另一种方式识别:联机手写识别技术,该方式适合有笔迹过程记录的文字识别(例如输入法的手写输入),下篇文章记录灵云的HWR的使用。
腾讯Ocr文字识别的更多相关文章
- 云+社区分享——腾讯云OCR文字识别
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云+社区运营团队发布在腾讯云+社区 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识 ...
- 我的AI之路 —— OCR文字识别快速体验版
OCR的全称是Optical Character Recoginition,光学字符识别技术.目前应用于各个领域方向,甚至这些应用就在我们的身边,比如身份证的识别.交通路牌的识别.车牌的自动识别等等. ...
- 如何精准实现OCR文字识别?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算基础发表于云+社区专栏 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识别-- ...
- 百度Ocr文字识别
简述 最近开发一个项目需要用到Ocr文字识别技术来识别手写文字,在评估过程中体验了百度的文字识别和腾讯的文字识别.查找官方开发文档,发现它们都有印刷体和手写体两种符合项目需求的识别模式,但是腾讯的手写 ...
- Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)
身份证识别:https://github.com/wenchaosong/OCR_identify 遇到一个需求,要用手机扫描纸质面单,获取面单上的手机号,最后决定用tesseract这个开源OCR库 ...
- 怎么给OCR文字识别软件重编文档页面号码
ABBYY FineReader Pro for Mac OCR文字识别软件处理文档时,在FineReader文档中,页面的加载顺序即是页面的导入顺序,完成导入之后,文档的所有页面均会被编号,各编号会 ...
- 对OCR文字识别软件的扫描选项怎么设置
说到OCR文字识别软件,越来越多的人选择使用ABBYY FineReader识别和转换文档,然而并不是每个人都知道转换质量取决于源图像的质量和所选的扫描选项,今天就给大家普及一下这方面的知识. ABB ...
- 怎么提高OCR文字识别软件的识别正确率
在OCR文字识别软件当中,ABBYY FineReader是比较好用的程序之一,但再好的识别软件也不能保证100%的识别正确率,用户都喜欢软件的正确率高一些,以减轻识别后修正的负担,很多用户也都提过这 ...
- OCR文字识别软件许可文件被误删了怎么办
使用任何一款软件,都会有误操作的情况发生,比如清理文件时一不小心删除了许可文件,对于ABBYY FineReader 12这样一款OCR文字识别软件,因失误错误删除了许可文件该怎么办呢?今天就来给大家 ...
随机推荐
- MetaMask安装使用指南
1.MetaMask(轻钱包) MetaMask是一款在谷歌浏览器Chrome上使用的插件类型的以太坊钱包,该钱包不需要下载,只需要在谷歌浏览器或基于谷歌浏览器内核的其它浏览器(如:360极速浏览器- ...
- 剑指offer三从头到尾打印链表
一.题目: 输入一个链表,从尾到头打印链表每个节点的值. 二.解题方法: 方法一:采用递归的方式实现 方法二:借助堆栈的“后进先出”实现 import java.util.ArrayList; imp ...
- 抓包和测试Api类工具
1.PostMan 测试api 2.Fiddler4抓包工具使用教程一
- ActiveMQ配置高可用性的方式
当一个应用被部署于生产环境,灾备计划是非常重要的,以便从网络故障,硬件故障,软件故障或者电源故障中恢复.通过合理的配置ActiveMQ,可以解决上诉问题.最典型的配置方法是运行多个Broker,一旦某 ...
- [转]让程序不触发 Vista/Win7下应用程序兼容性助手弹出 .
原文地址 http://blog.csdn.net/maxuhuiabc/article/details/6081874 在Vista/Win7下 运行一个 exe 应用程序后,系统经常弹出 兼容性助 ...
- JBOSS Spring Web
jndi: <datasources> <xa-datasource> <jndi-name>jdbc/sss-local</jndi-name> &l ...
- mysql索引总结(4)-MySQL索引失效的几种情况
mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...
- [九省联考2018] 一双木棋 chess
Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可 ...
- C#Redis 常用key操作
一.前戏 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有一个共同点,即所有的操作都是针对与Ke ...
- .30-浅析webpack源码之doResolve事件流(2)
这里所有的插件都对应着一个小功能,画个图整理下目前流程: 上节是从ParsePlugin中出来,对'./input.js'入口文件的路径做了处理,返回如下: ParsePlugin.prototype ...