java使用OCR
一、Tess4J
1.下载chi_sim.traineddata 和 eng.traineddata语言包(https://github.com/tesseract-ocr/tessdata)
2.pom文件引入
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.0.0</version>
</dependency>
3.示例代码
public static void main(String[] args) {
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("D:\\tessdata\\data");
// 简体中文:chi_sim,英文:eng
tesseract.setLanguage("chi_sim");
try {
String result = tesseract.doOCR(new File("D:\\tessdata\\img\\test.png"));
System.out.println("result: " + result);
} catch (TesseractException e) {
e.printStackTrace();
}
}
测试识别内容:
Tesseract Introduction
做了一段时间的OCR。在PC的Visual Studio上和在TI/ADI的DSP上都做过。一般都是看项目的具体情况,然后根据这具体情况,设计一套算法。设计好了之后,这套算法就只能应用在这个项目上了。如果再来一个新的项目,就又得从头写起。可是,不就是做OCR吗,不都差不多嘛!要是所有的OCR项目都能使用同一套代码,那得有多帅呀!
想一想,要做这件事,大概有下面这么些挑战:
- 自动搜索文字。目前我做的文字定位,都是知道文字在图像的什么地方,然后用经验参数定位的。这样的话,就必须针对不同的识别任务,制订不同的识别参数。如果识别任务中表明不能确定文字所在的地方,那我就歇菜了。反之,如果能自动地定位到文字的所在之处,那不就离我的目标近了一步吗?
- 自动分割。目前我做的文字分割,基本都是预先知道有多少个字,字和字之前的间隔情况是怎么样的等等一系列的信息之后,才可以开始动手分割。可是如果我不知道这些信息呢?我又抓瞎了。
- 自动识别。非常不好意思,我现在能做OCR基本只能说在初级阶段。可以做英文和数字的OCR,而且还必须预先知道它们的字体是什么样的。要是任务中说,字体不定,那对不起,又是mission impossible。
测试识别结果:
result: Tesseract Introduction
做 了 一 殷 时 间 的 0CR。、 在 PC 的 Viual Studio 上 和 在 T/AD 的 DSP 上 部 佩 仪 、 一 舫 都 星 着 顶 日 的 其 体 情 周 , 然 后 栗 探 讷 咤 体 情 周 , 设 计 一
娟 藩 法 、 设 计 好 了 之 后 , 这 套 籁 法 尬 司 能 应 用 在 仪 个 顶 目 上 了 , 加 果 育 朱一 个 新 的 项 目 , 就 又 得 从 头 冗 起 , 可 是 , 不 就 是 做 0CR@, 不
都 悟 万 多 嘉 ! 如 显 所 有 的 OCR 顶 目 鄂 能 傲 用 吟 一 娟 代 矿 , 那 得 有 多 师 听 !想 一 想 , 要 健 匹 伦 事 , 大 梅 有 下 面 这 么 些 技 战 :
自 动 摸 家 文 宇 , 目 酶 我 做 的 文 字 定 位 , 都 是 知 文 字 在 国 像 的 什 么 地 方 , 焦 名 用 经 验 参 数 定 他 的 , 这 样 的 话 , 就 必 顷 针 对 不 同 的 沙 引
代 务 , 制 订 不 同 的 识 刑 参 散 , 如 果 识 别 代 务 中 表 明 万 能 磁 定 文 字 所 在 的 地 方 , 那 我 尬 歇 菜 了 , 反 之 , 如 果 能 自 动 地 定 位 刹 文 字 的 所
之 犯 , 那 万 就 高 我 的 目 标 近 了 一 步 叨 ?自 动 分 列 。 目 刑 我 侦 的 文 字 分 剩 , 基 本 都 是 预 免 知 渡 有 多 少 个 字 , 字 和 字 之 前 的 间 随 惑 求 是 忍 人 样 的 笛 等 一 系 列 的 信 息 之 后 , 才 可 以
异 动 手 分 制 、 可 是 加 果 我 万 知 渡 这 些 信 息 肥 ? 我 又 执 唐 了 .自 动 识 别 。 非 常 不 好 痴 思 , 我 现 在 能 做 OCR 基 本 只 能 词 在 切 红 阵 殴 , 可 以 健 英 文 和 敦 孙 的 OCR, 而 日 还 顾 预 兆 知 道 它 们 的 字 体 是
什 么 栾 皋 。 要 是 任 务 中 说 , 字 余 万 定 , 邱 对 不 起 , 又 是 msson mposstble。
二、百度OCR接口(https://cloud.baidu.com/product/ocr)
1.pom文件引入
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.16.3</version>
</dependency>
2.示例代码
// 设置APPID/AK/SK,百度开放平台申请
public static final String APP_ID = "xxx";
public static final String API_KEY = "xxx";
public static final String SECRET_KEY = "xxx";
public static void main(String[] args) {
// 初始化一个AipOcr
AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
// client.setConnectionTimeoutInMillis(2000);
// client.setSocketTimeoutInMillis(60000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
// client.setHttpProxy("proxy_host", proxy_port); // 设置http代理
// client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
// System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("detect_direction", "true");
options.put("probability", "true");
// 调用通用文字识别(高精度版)接口
String path = "D:\\AipOcr\\test.png";
JSONObject res = client.basicAccurateGeneral(path, options);
System.out.println(res);
}
测试识别内容:
文字识别
多场景、多语种、高精度的文字检测与识别服务,多项ICDAR指标居世界第一;广泛适用于远程身份认证、财税报销、文档电子化等场景,为企业降本增效;提供稳定易用的在线API、离线SDK、软件部署包多种服务形式
测试识别结果:
[main] INFO com.baidu.aip.client.BaseClient - get access_token success. current state: STATE_AIP_AUTH_OK
{
"words_result": [
{
"probability": {
"average": 0.9998205304,
"min": 0.9995654225,
"variance": 3.399270554e-8
},
"words": "文字识别"
},
{
"probability": {
"average": 0.9861286879,
"min": 0.7947289348,
"variance": 0.001485200832
},
"words": "多场景、多语种、高精度的文字检测与识别服务,多项CDAR指标居世界第一;广泛适"
},
{
"probability": {
"average": 0.9937770367,
"min": 0.9039209485,
"variance": 0.0003865746548
},
"words": "用于远程身份认证、财税报销、文档电子化等场景,为企业降本增效;提供稳定易用的"
},
{
"probability": {
"average": 0.9717450142,
"min": 0.4633237422,
"variance": 0.01199602988
},
"words": "在线API、离线SDK、软件部署包多种服务形式"
}
],
"log_id": 1480825588763090000,
"words_result_num": 4,
"direction": 0
}