java使用OCR


一、Tess4J

1.下载chi_sim.traineddata 和 eng.traineddata语言包(https://github.com/tesseract-ocr/tessdata)

2.pom文件引入


    net.sourceforge.tess4j
    tess4j
    5.0.0


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文件引入


    com.baidu.aip
    java-sdk
    4.16.3


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 options = new HashMap();
	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
}