An open API service indexing awesome lists of open source software.

https://github.com/hiroi-sora/rapidocr-json

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。基于 RapidOcrOnnx 。
https://github.com/hiroi-sora/rapidocr-json

Last synced: 16 days ago
JSON representation

OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。基于 RapidOcrOnnx 。

Awesome Lists containing this project

README

        

#### 离线OCR组件 系列项目:
- [PaddleOCR-json](https://github.com/hiroi-sora/PaddleOCR-json)
- **RapidOCR-json**

| | PaddleOCR-json | RapidOCR-json |
| ---------------- | ----------------------------------------------- | -------------------- |
| CPU要求 | CPU必须具有AVX指令集。不支持以下CPU: | 无特殊要求 👍 |
| | 凌动Atom,安腾Itanium,赛扬Celeron,奔腾Pentium | |
| 推理加速库 | mkldnn 👍 | 无 |
| 识别速度 | 快(启用mkldnn加速)👍 | 中等 |
| | 极慢(不启用mkldnn) | |
| 初始化耗时 | 约2s,慢 | 0.1s内,快 👍 |
| 组件体积(压缩) | 52MB | 15MB 👍 |
| 组件体积(部署) | 250MB | 30MB 👍 |
| CPU占用 | 高,榨干硬件性能 | 较低,对低配机器友好 |
| 内存占用峰值 | >2000MB(启用mkldnn) | ~500MB 👍 |
| | ~600MB(不启用mkldnn) | |

---

# RapidOCR-json

这是一个基于 [RapidOcrOnnx](https://github.com/RapidAI/RapidOcrOnnx) 的离线图片OCR文字识别程序。通过管道等方式输入本地图片路径,输出识别结果json字符串。适用于 `Win7 x64` 及以上的系统。

本项目旨在提供一个封装好的OCR引擎组件,使得没有C++编程基础的用户也可以用别的语言来简单地调用OCR,享受到更快的运行效率、更便捷的打包&部署手段。

![](/readme_images/img-1.png)

## 准备工作

下载 [RapidOCR-json v0.2.0](https://github.com/hiroi-sora/RapidOCR-json/releases/tag/v0.2.0) 并解压,即可。

### 简单试用

方式一:

打开控制台,输入 `path/RapidOCR-json.exe --image_path=path/test1.png` 。

方式二:

直接双击打开 `RapidOCR_json.exe` 。等程序初始化完毕输出`OCR init completed.`。

使用json字符串输入图片路径,建议使用ascii转义。如:

`{"image_path":"D:/\u6d4b\u8bd5\u56fe\u7247.png"}`

也支持传入图片base64编码的字符串。如:

`{"image_base64":"……"}`

还可以直接使用 [Python API](api/python/) 。

## 指令说明

| 键名称 | 值说明 | 默认值 |
| -------------- | ------------------------------------ | ------------------------------------- |
| ensureAscii | 启用(1)/禁用(0) ASCII转义输出 | 0 |
| models | 模型目录地址,可绝对or相对路径 | "models" |
| det | det库名称 | "ch_PP-OCRv3_det_infer.onnx" |
| cls | cls库名称 | "ch_ppocr_mobile_v2.0_cls_infer.onnx" |
| rec | rec库名称 | "ch_PP-OCRv3_rec_infer.onnx" |
| keys | rec字典名称 | "ppocr_keys_v1.txt" |
| doAngle | 启用(1)/禁用(0) 文字方向检测 | 1 |
| mostAngle | 启用(1)/禁用(0) 角度投票 | 1 |
| numThread | 线程数 | 4 |
| padding | 预处理白边宽度,可优化窄边图片识别率 | 50 |
| maxSideLen | 图片长边缩小值,可提高大图速度 | 1024 |
| boxScoreThresh | 文字框置信度门限值 | 0.5 |
| boxThresh | | 0.3 |
| unClipRatio | 单个文字框大小倍率 | 1.6 |
| image_path | 初始图片路径 | "" |

例1:(启动时传入图片路径,执行一次识别,然后关闭程序)
```
RapidOCR_json.exe --image_path="D:/images/test(1).png"
输出: 识别结果
```

例2:(启动时不传入图片路径,进入无限循环,不断接受json输入)
```
RapidOCR_json.exe --ensureAscii=1
输出: OCR init completed.
{"image_path": "D:/images/test(1).png"}
输出: 识别结果
```

例3:(手动指定参数)
```
RapidOCR_json.exe --doAngle=0 --mostAngle=0 --numThread=12 --padding=100 --image_path="D:/images/test(1).png"
```

## 返回值说明

通过API调用一次OCR,无论成功与否,都会返回一个字典。

字典中,根含两个元素:状态码`code`和内容`data`。

状态码`code`为整数,每种状态码对应一种情况:

##### `100` 识别到文字

- data内容为数组。数组每一项为字典,含三个元素:
- `text` :文本内容,字符串。
- `box` :文本包围盒,长度为4的数组,分别为左上角、右上角、右下角、左下角的`[x,y]`。整数。
- `score` :识别置信度,浮点数。
- 例:
```
{'code':100,'data':[{'box':[[13,5],[161,5],[161,27],[13,27]],'score':0.9996442794799805,'text':'飞舞的因果交流'}]}
```

##### `101` 未识别到文字

- data为字符串:`No text found in image. Path:"图片路径"`
- 例:```{'code':101,'data':'No text found in image. Path: "D:\\空白.png"'}```
- 这是正常现象,识别没有文字的空白图片时会出现这种结果。

##### `200` 图片路径不存在

- data为字符串:`Image path dose not exist. Path:"图片路径".`
- 例:`{'code':200,'data':'Image path dose not exist. Path: "D:\\不存在.png"'}`
- 注意,在系统未开启utf-8支持(`使用 Unicode UTF-8 提供全球语言支持"`)时,不能读入含emoji等特殊字符的路径(如`😀.png`)。但一般的中文及其他 Unicode 字符路径是没问题的,不受系统区域及默认编码影响。

##### `201` 图片路径string无法转换到wstring

- data为字符串:`Image path failed to convert to utf-16 wstring. Path: "图片路径".`
- 使用API时,理论上不会报这个错。
- 开发API时,若传入字符串的编码不合法,有可能报这个错。

##### `202` 图片路径存在,但无法打开文件

- data为字符串:`Image open failed. Path: "图片路径".`
- 可能由系统权限等原因引起。

##### `203` 图片打开成功,但读取到的内容无法被opencv解码

- data为字符串:`Image decode failed. Path: "图片路径".`
- 注意,引擎不以文件后缀来区分各种图片,而是对存在的路径,均读入字节尝试解码。若传入的文件路径不是图片,或图片已损坏,则会报这个错。
- 反之,将正常图片的后缀改为别的(如`.png`改成`.jpg或.exe`),也可以被正常识别。

##### `210` 剪贴板打开失败

- data为字符串:`Clipboard open failed.`
- 可能由别的程序正在占用剪贴板等原因引起。

##### `211` 剪贴板为空

- data为字符串:`Clipboard is empty.`

##### `212` 剪贴板的格式不支持

- data为字符串:`Clipboard format is not valid.`
- 引擎只能识别剪贴板中的位图或文件。若不是这两种格式(如复制了一段文本),则会报这个错。

##### `213` 剪贴板获取内容句柄失败

- data为字符串:`Getting clipboard data handle failed.`
- 可能由别的程序正在占用剪贴板等原因引起。

##### `214` 剪贴板查询到的文件的数量不为1

- data为字符串:`Clipboard number of query files is not valid. Number: 文件数量`
- 只允许一次复制一个文件。一次复制多个文件再调用OCR会得到此报错。

##### `215` 剪贴板检索图形对象信息失败

- data为字符串:`Clipboard get bitmap object failed.`
- 剪贴板中是位图,但获取位图信息失败。可能由别的程序正在占用剪贴板等原因引起。

##### `216` 剪贴板获取位图数据失败

- data为字符串:`Getting clipboard bitmap bits failed.`
- 剪贴板中是位图,获取位图信息成功,但读入缓冲区失败。可能由别的程序正在占用剪贴板等原因引起。

##### `217` 剪贴板中位图的通道数不支持

- data为字符串:`Clipboard number of image channels is not valid. Number: 通道数`
- 引擎只允许读入通道为1(黑白)、3(RGB)、4(RGBA)的图片。位图通道数不是1、3或4,会报这个错。

##### `299` 未知异常

- data为字符串:`An unknown error has occurred.`
- 正常情况下不应该出现此状态码。请提issue。

##### `300` 返回数据无法转换为json字符串

- data为字符串:`JSON dump failed. Coding error.`
- 通过启动参数-image_dir传入非法编码的路径(含中文)时引起。(中文路径应该先启动程序再输入)

## 通过API调用

### 1. Python API

[资源目录](api/python)

使用示例:
```python
import os
import sys

from RapidOCR_api import OcrAPI

ocrPath = '引擎路径/RapidOCR_json.exe'
ocr = OcrAPI(ocrPath)
res = ocr.run('样例.png')

print('OCR识别结果:\n', res)
ocr.stop()
```

其他待填坑……

## [项目构建指南](cpp)
👆当你需要修改项目源码时欢迎参考。

## 感谢

感谢 [RapidAI/RapidOcrOnnx](https://github.com/RapidAI/RapidOcrOnnx) ,没有它就没有本项目。

本项目中使用了 [nlohmann/json](https://github.com/nlohmann/json) :
> “JSON for Modern C++”

## 更新日志

#### v0.2.0 `2023.9.25`
- 路径识图的key由 `imagePath` 改为 `image_path`
- 新功能:base64识图,key为 `image_base64`

#### v0.1.0 `2023.4.29`