在日常的工作中,例如自动化测试开展时,经常涉及到一些验证码识别、文本识别、图像识别的场景,市面上虽也有很多识别工具,但质量、准确性参差不齐。
今天给大家推荐一个开源 OCR 项目:Umi-OCR,功能很强大,而且还可以离线使用,现在已经有了 19.7k+的星标,足见该项目的受欢迎程度。
1、项目介绍
该项目是基于 PaddleOCR 开发的,用 Python 编写,目前只支持 Windows 平台运行,跨平台还在筹备中。
项目地址:
https://github.com/hiroi-sora/Umi-OCR
https://gitee.com/mirrors/Umi-OCR.git
项目结构:
Umi-OCR
├─ Umi-OCR.exe
└─ UmiOCR-data
├─ main.py **
├─ version.py **
├─ site-packages
│ └─ python 包
├─ runtime
│ └─ python 解释器
├─ qt_res **
│ └─ 项目 qt 资源,包括图标和 qml 源码
├─ py_src **
│ └─ 项目 python 源码
├─ plugins
│ └─ 插件
└─ i18n **
└─ 翻译文件
项目特点:
- 免费:本项目所有代码开源,完全免费。
- 方便:解压即用,离线运行,无需网络。
- 高效:自带高效率的离线 OCR 引擎,内置多种语言识别库。
- 灵活:支持命令行、HTTP 接口等多种调用方式。
- 功能:截图 OCR / 批量 OCR / PDF 识别 / 二维码 / 公式识别
2、项目使用
直接在 releases 中选择合适的版本,可选择以下方式下载:
GitHub https://github.com/hiroi-sora/Umi-OCR/releases/latest
蓝奏云 https://hiroi-sora.lanzoul.com/s/umi-ocr
Source Forge https://sourceforge.net/projects/umi-ocr
本软件无需安装,解压后,点击 Umi-OCR.exe 即可启动程序。
截图 OCR
这个功能很适合在一些不能复制的网页上使用,速度很快,准确率也很高。
截图 OCR:打开这一页后,就可以用快捷键唤起截图,识别图中的文字。
- 左侧的图片预览栏,可直接用鼠标划选复制。
- 右侧的识别记录栏,可以编辑文字,允许划选多个记录复制。
- 也支持在别处复制图片,粘贴到 Umi-OCR 进行识别。
批量 OCR
如果需要一次性识别多图片,这个功能值得拥有
只需要将所有的图片导入,然后点击开始任务,就可以批量识别了。
批量 OCR:这一页支持批量导入本地图片并识别。
- 识别内容可以保存为 txt / jsonl / md / csv(Excel) 等多种格式。
- 与截图 OCR 一样,支持文本后处理功能,整理 OCR 文本的排版和顺序。
- 支持 忽略区域 。
- 没有数量上限,可一次性导入几百张图片进行任务。
可自定义忽略区域
忽略区域:批量 OCR 中的一种特殊功能,适用于排除图片中的不想要的文字。
文档识别
文档识别:
- 支持导入 pdf, xps, epub, mobi, fb2, cbz 格式的文件。
- 对扫描件进行 OCR,或提取原有文本。可输出为 双层可搜索 PDF 。
- 支持设定 忽略区域 ,可用于排除页眉页脚的文字。
- 可设置任务完成后 自动关机/休眠 。
支持命令行、接口调用
支持通过命令行或 HTTP 接口的方式来调用,命令行调用入口就是主程序 Umi-OCR.exe
OCR 指令命令行使用:
截屏:Umi-OCR.exe --screenshot
粘贴图片:Umi-OCR.exe --clipboard
指定地址:Umi-OCR.exe --path "D:/xxx.png"
结果输出:Umi-OCR.exe --screenshot --> test.txt
OCR 指令均可在控制台回传识别结果。请耐心等待,在一次指令结束前不要输入下一条指令。所有指令支持用前几个字母替代,如–screenshot、–clipboard 可以分别简写为–sc、–cl。具体可自己尝试。
HTTP 接口
需先勾选开启 HTTP 服务,
必须允许 HTTP 服务才能使用 HTTP 接口(默认开启)。如果需要允许被局域网访问,请将主机切换到任何可用地址。
示例如下:
import requests
import json
url = "http://127.0.0.1:1224/api/ocr"
data = {
"base64": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAXCAIAAAD7ruoFAAAACXBIWXMAABnWAAAZ1gEY0crtAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAAHjSURBVEiJ7ZYrcsMwEEBXnR7FLuj0BPIJHJOi0DAZ2qSsMCxEgjYrDQqJdALrBJ2ASndRgeNI8ledutOCLrLl1e7T/mRkjIG/IXe/DWBldRTNEoQSpgNURe5puiiaJehrMuJSXSTgbaby0A1WzLrCCQCmyn0FwoN0V06QONWAt1nUxfnjHYA8p65GjhDKxcjedVH6JOejBPwYh21eE0Wzfe0tqIsEkGXcVcpoMH4CRZ+P0lsQp/pWJ4ripf1XFDFe8GHSHlYcSo9Es31t60RdFlN1RUmrma5oTzTVB8ZUaeeYEC9GmL6kNkDw9BANAQYo3xTNdqUkvHq+rYhDKW0Bj3RSEIpmyWyBaZaMTCrCK+tJ5Jsa07fs3E7esE66HzralRLgJKp0/BD6fJRSxvmDsb6joqkcFXGqMVVFFEHDL2gTxwCAaTabnkFUWhDCHTd9iYrGcAL1ZnqIp5Vpiqh7bCfua7FA4qN0INMcN1+cgCzj+UFxtbmvwdZvGIrI41JiqhZBWhhF8WxorkYPpQwJiWYJeA3rXE4hzcwJ+B96F9zCFHC0FcVegghvFul7oeEE8PvHeJqC0w0AUbbFIT8JnEwGbPKcS2OxU3HMTqD0r4wgEIuiKJ7i4MS16+og8/+bPZRPLa+6Ld2DSzcAAAAASUVORK5CYII=",
# 可选参数
# Paddle 引擎模式
# "options": {
# "ocr.language": "models/config_chinese.txt",
# "ocr.cls": False,
# "ocr.limit_side_len": 960,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
# Rapid 引擎模式
# "options": {
# "ocr.language": "简体中文",
# "ocr.angle": False,
# "ocr.maxSideLen": 1024,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
}
headers = {"Content-Type": "application/json"}
data_str = json.dumps(data)
response = requests.post(url, data=data_str, headers=headers)
if response.status_code == 200:
res_dict = json.loads(response.text)
print("返回值字典\n", res_dict)
更多详细使用可参考:
- https://gitee.com/mirrors/Umi-OCR/blob/main/docs/README_CLI.md
- https://gitee.com/mirrors/Umi-OCR/blob/main/docs/README_HTTP.md