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. 请求参数解析
三. 编写代码解析图片
public static void main(String[] args) {HashMap<String,Object> map = new HashMap<>();String imgStr = "data:image/jpg;base64,"+getImgStr("G:/-09-24/c8dc889efdb06f4f3860e2cd8ff1750.jpg");map.put("apikey","your keys");//map.put("url","/Jarvis_D/typora-images/raw/master/img/0f08de942bb82ff8675f790b9b0a74a.png");map.put("base64Image",imgStr);//map.put("language","chs");map.put("filetype","JPG");map.put("OCREngine",2);//map.put("scale",true);String yy = HttpUtil.post("https://api.ocr.space/parse/image",map);//String yy = HttpUtils.doPostToJson("https://api.ocr.space/parse/image", JSON.toJSONString(map));JsonRootBean jsonRootBean = JSON.parseObject(yy, JsonRootBean.class);System.err.println(jsonRootBean.getParsedResults().get(0).getParsedText());}/*** 将图片转换成Base64编码* @param imgFile 待处理图片* @return*/public static String getImgStr(String imgFile) {InputStream in = null;byte[] data = null;try {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理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"}