Java 实现图片OCR文字识别功能
前言:
由于网上很多算法, 以及语言库无法做到精准识别, 所以综合条件下 使用了一款 space OCR API 的产品进行使用, 每个月有25000条的 使用额度, 日常使用或开发绰绰有余
网址链接
一. 注册 API 秘钥
1. 进入网址点击下面的注册链接输入自己的邮箱以及开发用途就会收到一个秘钥
2. 注册好的API如下
二. API解析
1. 上传方式选择
通过阅读API 文档我们可以得知, 发送图片解析的方式有三种:
- ) URL 上传, 前提是需要将图片放到公网可以访问到的位置
- ) File 上传, 通过Post 请求将图片放到from-data中发送
- ) base64编码上传 [推荐~]
2. 识别引擎选择
OCR 引擎 1 的特点:
- - 支持更多语言(包括中文、日文和韩文等亚洲语言)
- - 快点
- - 支持更大的图像
- - 多页 TIFF 扫描支持
- - 参数:OCREngine=1
OCR 引擎 2 的特点:
- -仅限西方拉丁字符语言(英语、德语、法语…)
- - 语言自动检测。选择哪种 OCR 语言并不重要,只要它使用拉丁字符即可
- - 通常在单个数字 OCR、单个字符 OCR 和字母数字 OCR 方面表现更好(例如SUDOKO、 点阵 OCR、 MRZ OCR、 单个数字 OCR、OCR后 缺少第一个字母,…)
- - 通常更擅长特殊字符 OCR,如@±…
- - 通常使用旋转文本效果更好(论坛:检测垃圾图片)
- - 图像大小限制为 5000 像素宽度和 5000 像素高度
- - 参数:OCREngine=2
3. 传参选择
在请求过程中只有两个参数是必填的, 分别是 apikey和 三种上传方式的一种
- ) language 在识别中文时可以选择 chs(简体), cht(繁体) 两种, 不识别中文可以选择引擎二 并且不用填写该参数
- ) filetype 填写该参数可以有效的增加识别精度
- ) scale 如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。 API 默认使用 scale=false
4. 请求参数解析
apikey | API 密钥 | |
---|
url 或file 或base64Image | url :远程图像文件的 URL(确保它具有正确的内容类型) file :具有文件名的多部分编码图像文件 base64Image :图像或 PDF 作为Base64 编码字符串 | 您可以使用三种方法上传输入图像或 PDF。对于大于 10 MB 的文件,我们建议使用 URL 方法以提高上传速度。 |
language | [可选] 阿拉伯语=ara 保加利亚语=bul 中文(简体)=chs 中文(繁体)=cht 克罗地亚语=hrv 捷克语=cze 丹麦语=dan 荷兰语=dut 英语=eng 芬兰语=fin 法语=fre 德语=ger 希腊语=gre 匈牙利语=hun 韩语=kor 意大利语=ita 日语=jpn 波兰语=pol 葡萄牙语=por 俄语=rus 斯洛文尼亚语=slv 西班牙语=spa 瑞典语=swe 土耳其语 = tur | 用于 OCR 的语言。如果未指定语言,eng 则默认使用英语。 重要提示:语言代码总是3-letters (不是 2)。所以它是“eng”而不是“en”。 Engine2具有自动西文检测功能,因此该值将被忽略。 |
isOverlayRequired | [可选] 布尔值 | 默认值 =False 如果为 true,则返回每个单词的边界框坐标。如果为 false,则 OCR 处理的文本仅作为文本块返回(这会使 JSON 响应变小)。例如,覆盖数据可用于在图像上显示文本。 |
filetype | [可选] 字符串值:PDF、GIF、PNG、JPG、TIF、BMP | 覆盖基于content-type的自动文件类型检测。支持的图像文件格式有 png、jpg (jpeg)、gif、tif (tiff) 和 bmp。对于文档 ocr,api 支持 Adobe PDF 格式。支持多页 TIFF 文件。 |
detectOrientation | [可选] 真/假 | 如果设置为 true,api 会正确自动旋转图像并TextOrientation 在 JSON 响应中设置参数。如果图像未旋转,则TextOrientation=0,否则为旋转度数,例如“270”。 |
isCreateSearchablePdf | [可选] 布尔值 | 默认值 =False 如果为 true,API 会生成可搜索的 PDF。此参数自动设置 isOverlayRequired = true。 |
isSearchablePdfHideTextLayer | [可选] 布尔值 | 默认值 = False 。如果为 true,则隐藏文本层(不可见) |
scale | [可选] 真/假 | 如果设置为 true,api 会进行一些内部升级。这可以显着改善 OCR 结果,尤其是对于低分辨率 PDF 扫描。请注意, API 默认使用 scale=false |
isTable | [可选] 真/假 | 如果设置为 true,则 OCR 逻辑确保始终逐行返回解析的文本结果。建议将此开关用于 表格 OCR、收据 OCR、发票处理和所有其他类型的具有表格结构的输入文档。 |
OCREngine | [可选] 1 或 2 | 引擎 1 是默认值 |
三. 编写代码解析图片
public static void main(String[] args) {
HashMap<String,Object> map = new HashMap<>();
String imgStr = "data:image/jpg;base64,"+getImgStr("G:/2021-09-24/c8dc889efdb06f4f3860e2cd8ff1750.jpg");
map.put("apikey","your keys");
map.put("base64Image",imgStr);
map.put("filetype","JPG");
map.put("OCREngine",2);
String yy = HttpUtil.post("https://api.ocr.space/parse/image",map);
JsonRootBean jsonRootBean = JSON.parseObject(yy, JsonRootBean.class);
System.err.println(jsonRootBean.getParsedResults().get(0).getParsedText());
}
public static String getImgStr(String imgFile) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return Base64.encodeBase64String(data);
}
四. 返回结果的解析
1. 返回格式
{
"ParsedResults" : [
{
"TextOverlay" : {
"Lines" : [
{
"Words": [
{
"WordText": "Word 1",
"Left": 106,
"Top": 91,
"Height": 9,
"Width": 11
},
{
"WordText": "Word 2",
"Left": 121,
"Top": 90,
"Height": 13,
"Width": 51
}
],
"MaxHeight": 13,
"MinTop": 90
}
],
"HasOverlay" : true,
"Message" : null
},
"FileParseExitCode" : "1",
"ParsedText" : "This is a sample parsed result",
"ErrorMessage" : null,
"ErrorDetails" : null
},
{
"TextOverlay" : null,
"FileParseExitCode" : -10,
"ParsedText" : null,
"ErrorMessage" : "...error message (if any)",
"ErrorDetails" : "...detailed error message (if any)"
}
],
"OCRExitCode" : "2",
"IsErroredOnProcessing" : false,
"ErrorMessage" : null,
"ErrorDetails" : null,
"SearchablePDFURL": "https://.....",
"ProcessingTimeInMilliseconds" : "3000"
}
2. 返回参数解析
ParsedResults | OCR结果 | 图像或 PDF 每一页的 OCR 结果。对于 PDF:每个页面都有自己的 OCR 结果和错误消息(如果有) |
---|
OCRExitCode | 整数 | 退出代码显示 OCR 是否成功完成、部分或失败并出现错误 1: 解析成功(图像/所有页面解析成功) 2: 部分解析(所有页面中只有几页成功解析) 3: 图像/所有 PDF 页面解析失败(这主要发生因为 OCR 引擎无法解析图像) 4: 尝试解析时发生错误(在解析过程中发生致命错误时会发生这种情况) |
IsErroredOnProcessing | 真假 | 如果在解析 Image/PDF 页面时发生错误 |
ErrorMessage | 文本 | 解析图片时出现错误的报错信息 |
ErrorDetails | 文本 | 详细的错误信息 |
SearchablePDFURL | 关联 | 查看可搜索的 PDF |
图像/页面解析结果 | | |
FileParseExitCode | 每个解析结果的退出代码 | 解析引擎返回的退出代码 0: File not found 1: Success -10: OCR Engine Parse Error -20: Timeout -30: Validation Error -99: Unknown Error |
ParsedText | 解析文本 | 图像的解析文本 |
TextOverlay | 图像/pdf 中文本的覆盖数据 | 仅当 ‘isOverlayRequired’ 设置为 ‘True’ |
Lines | 覆盖文本中的行数组 | 这包含所有行的数组。每行将包含一个单词数组 |
Words | 一行中的一组单词 | 这包含具有单词特定细节的单词,例如其文本和位置 |
WordText | 文字的文字 | 这包含该特定单词的文本 |
Left | 单词与左侧的距离(以像素 (px) 为单位) | 包含单词与图像左边缘的距离(以 px 为单位) |
Top | 单词与顶部的距离(以 px 为单位) | 包含单词与图像上边缘的距离(以 px 为单位) |
Height | 字的高度 | 包含单词的高度(以像素为单位) |
Width | 字宽 | 包含单词的宽度(以像素为单位) |
MaxHeight | 线的最大高度 | 包含线的高度(以像素为单位) |
MinTop | 线距图像上边缘的最小距离 | 包含图像原始大小中线距顶部边缘的距离(以 px 为单位) |
HasOverlay | 叠加层是否存在 | 真/假取决于解析结果的覆盖是否存在 |
ErrorMessage | 文本 | 解析引擎返回的错误信息 |
ErrorDetails | 文本 | 解析引擎返回的用于调试的详细错误信息 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)