-
Notifications
You must be signed in to change notification settings - Fork 262
ocr
文字识别
OCR 有两条识别路径:
- 点阵字库识别:调用
SetDict/SetMemDict/AddDict加载字库后,Ocr/OcrEx/FindStr等接口会使用本地点阵字库匹配。 - OCR HTTP 服务识别:当前字库为空时,会访问独立 OCR 服务 op_ocr_engine,适合不维护点阵字库的通用文字识别场景。
OCR HTTP 服务是独立进程,不嵌入 op_x86.dll/op_x64.dll 内部。OP 负责截图或读取图片,然后把原始像素通过 HTTP 发送给服务端,服务端返回文字、坐标和置信度。
适合使用 OCR 服务的场景:
- 不想制作点阵字库,直接识别普通中文、英文或混合文本。
- 字体、字号、抗锯齿、背景变化较多,点阵字库维护成本较高。
- 需要识别整段文本、截图文字、UI 文案或图片文件中的文字。
- 希望在 Tesseract 和 PaddleOCR 之间切换识别后端。
适合使用点阵字库的场景:
- 字体固定、颜色固定,追求更可控的识别结果。
- 需要配合
FindStr/FindStrEx做游戏或模拟器 UI 找字。 - 已有 OP 或大漠文本点阵字库,需要本地快速匹配。
当前字库为空时,以下接口会走 OCR HTTP 服务:
OcrOcrExOcrAutoOcrFromFileOcrAutoFromFileFindStrFindStrEx
如果已经加载过点阵字库,OP 会优先使用本地点阵字库。需要切回 OCR 服务时,可以不调用 SetDict/SetMemDict/AddDict,或者清空当前字库:
idx = op.GetNowDict()
op.ClearDict(idx)独立 OCR 服务仓库:
该仓库包含两类服务实现:
- Tesseract 5 C++ HTTP 服务:默认端口
8080 - PaddleOCR FastAPI 服务:默认端口
8081
两类服务保持相同 HTTP 协议,OP 端只需要切换服务地址即可。
服务端提供以下接口:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /health |
健康检查 |
| GET | /api/v1/version |
版本信息 |
| POST | /api/v1/ocr |
OCR 识别 |
POST /api/v1/ocr 的请求体为 JSON:
{
"image": "<base64_of_raw_pixels>",
"width": 640,
"height": 480,
"bpp": 4
}字段说明:
| 字段 | 说明 |
|---|---|
| image | 原始像素字节的 Base64 字符串 |
| width | 图像宽度 |
| height | 图像高度 |
| bpp | 每像素字节数,支持 1、3、4
|
注意:服务接收的是原始像素字节,不是 PNG/JPG/BMP 文件本体。通过 OP 的 Ocr/OcrEx/OcrAutoFromFile 等接口调用时,OP 会自动完成截图、读取图片、像素转换和 HTTP 请求。
成功响应示例:
{
"code": 0,
"results": [
{
"text": "你好",
"bbox": [10, 20, 120, 60],
"confidence": 91.2
}
]
}OP 会读取 results 中的 text、bbox 和 confidence,并用接口参数 sim 过滤识别结果。
- 默认后端:Tesseract
- 默认地址:
http://127.0.0.1:8080/api/v1/ocr - PaddleOCR 推荐地址:
http://127.0.0.1:8081/api/v1/ocr
默认超时时间为 3000ms。
先构建 op_ocr_engine:
cmake -S . -B build_service
cmake --build build_service --config Release准备 tessdata 目录,并放入语言模型,例如中文简体模型 chi_sim.traineddata。
build_service/Release/ocr_server.exe --datapath tessdata --lang chi_sim --host 0.0.0.0 --port 8080参数说明:
-
--datapath:Tesseract 模型目录。 -
--lang:语言模型名,中文简体常用chi_sim。 -
--host:监听地址,默认0.0.0.0。 -
--port:监听端口,默认8080。
PaddleOCR 服务位于 op_ocr_engine/py_paddle_server。
pip install -r py_paddle_server/requirements.txt
python -m py_paddle_server.app --host 0.0.0.0 --port 8081 --print-results也可以使用 uvicorn 启动:
python -m uvicorn py_paddle_server.app:app --host 0.0.0.0 --port 8081常用环境变量:
| 环境变量 | 说明 |
|---|---|
| PADDLE_LANG | 识别语言,默认 ch
|
| PADDLE_USE_GPU | 是否使用 GPU |
| PADDLE_USE_ANGLE_CLS | 是否开启方向分类 |
| PADDLE_SHOW_LOG | 是否打印 Paddle 日志 |
| PADDLE_PRINT_RESULTS | 是否打印每次请求识别结果 |
| PADDLE_DET_MODEL_DIR | 检测模型目录 |
| PADDLE_REC_MODEL_DIR | 识别模型目录 |
| PADDLE_CLS_MODEL_DIR | 方向分类模型目录 |
SetOcrEngine(path_of_engine, dll_name, argv) 现在支持以下几种形式:
- 直接传完整 URL:
http://127.0.0.1:8080/api/v1/ocrhttp://127.0.0.1:8081/api/v1/ocr
- 直接传后端别名:
tesseractpaddle
- 通过
argv指定:--url=http://127.0.0.1:8081/api/v1/ocr --timeout=5000
如果只传服务根地址,例如 http://127.0.0.1:8081,OP 会自动补成 http://127.0.0.1:8081/api/v1/ocr。
-
OP_OCR_BACKEND=tesseract:默认走http://127.0.0.1:8080/api/v1/ocr -
OP_OCR_BACKEND=paddle:默认走http://127.0.0.1:8081/api/v1/ocr -
OP_OCR_URL=http://127.0.0.1:9000/api/v1/ocr:显式覆盖默认服务地址 -
OP_OCR_TIMEOUT_MS=5000:覆盖默认超时
from win32com.client import Dispatch
op = Dispatch("op.opsoft")
# 1) 使用后端别名切换到 PaddleOCR
op.SetOcrEngine("paddle", "", "--timeout=5000")
# 2) 或直接指定完整 URL
# op.SetOcrEngine("http://127.0.0.1:8081/api/v1/ocr", "", "--timeout=5000")
# 不加载点阵字库,或清空当前字库,才会使用 OCR HTTP 服务
op.ClearDict(op.GetNowDict())
text = op.OcrAutoFromFile("screen.bmp", 0.8)
print(text)YOLO 检测也走独立 HTTP 服务。OP 负责截图、读取图片和发送原始像素,模型加载和推理由外部服务完成。
默认地址为 http://127.0.0.1:8090/api/v1/detect。SetYoloEngine 可以传完整 URL,也可以传基础地址,例如 http://127.0.0.1:8090,OP 会自动补全 /api/v1/detect。
支持的后端别名:
yoloyolo11yolov11yolo_httpyolo_server
环境变量:
-
OP_YOLO_URL:显式指定 YOLO 服务地址 -
OP_YOLO_BACKEND:指定后端别名 -
OP_YOLO_TIMEOUT_MS:指定请求超时,单位毫秒
请求体使用原始像素的 Base64,不是图片文件本体:
{
"image": "<base64_of_raw_pixels>",
"width": 800,
"height": 600,
"bpp": 4,
"conf": 0.25,
"iou": 0.45
}服务返回示例:
{
"code": 0,
"results": [
{
"class_id": 0,
"label": "button",
"bbox": [10, 20, 100, 120],
"confidence": 0.95
}
]
}类名字段兼容 label、class_name、name,类别 ID 字段兼容 class_id、cls,置信度字段兼容 confidence、conf。
YoloDetect 返回的坐标会转换为屏幕或绑定窗口区域坐标;YoloDetectFromFile 返回图片文件内坐标。
- SetOcrEngine: 设置 OCR HTTP 引擎
- SetYoloEngine: 设置 YOLO HTTP 引擎
- YoloDetect: 检测屏幕区域中的目标
- YoloDetectFromFile: 检测图片文件中的目标
- SetDict: 设置字库
- SetMemDict: 设置内存字库
- UseDict: 选择字库
- GetDict: 获取字库条目
- AddDict: 添加字库条目
- SaveDict: 保存字库
- ClearDict: 清空字库
- GetDictCount: 获取字库条目数量
- GetNowDict: 获取当前字库序号
- SetBinaryPreprocess: 设置点阵二值图预处理参数
- GetBinaryPreprocess: 获取点阵二值图预处理参数
- FetchWord: 从图像区域提取字库条目
- FetchWordEx: 按相似度提取单个点阵字
- ExtractWordRects: 自动切出点阵字块
- ExtractWordRectsEx: 按宽高和边距自动切字
- FetchWords: 自动切字并生成多条字库
- FetchWordsEx: 使用细化参数批量生成字库
- FetchWordsByRects: 按指定字块生成字库
- GetBinaryPreview: 预览区域二值图
- GetWordPreview: 预览单条字库点阵
- CheckWordDict: 检查字库文本
- NormalizeWordDict: 规范化字库文本
- RenameWordDict: 批量重命名字库条目
- GetWordsNoDict: 不依赖字库提取词块
- GetWordResultCount: 获取词块结果数量
- GetWordResultPos: 获取词块坐标
- GetWordResultStr: 获取词块内容
- Ocr: 文字识别
- OcrEx: 文字识别返回坐标
- OcrAuto: 文字识别自动二值化
- OcrFromFile: 从文件识别文字
- OcrAutoFromFile: 从文件识别文字
- FindStr: 寻找文字
- FindStrEx: 寻找文字
- FindLine: 寻找屏幕中的线
OP 的点阵 OCR 支持两类字库输入:
- OP 二进制字库:通常由
SaveDict保存,SetDict会优先按 OP 二进制.dict读取。 - 大漠文本点阵字库:格式为
点阵HEX$文本$左.右.数量$高度,例如FFFFFFFFFF$字$0.0.10$11。
导入大漠文本字库时,OP 会在加载边界把大漠点阵转换成内部点阵格式;内部识别仍使用 OP 自己的匹配结构。需要注意的是,当前兼容解析按大漠默认点阵高度 11 切分点阵,最后一段“高度”会校验但不参与内部宽高计算。
支持大漠文本格式的入口:
-
SetDict(idx, file):文件入口,优先读取 OP 二进制字库,失败后按大漠文本字库逐行导入。 -
SetMemDict(idx, data):内存字库入口,支持 OP 二进制.dict字节、大漠文本格式,也支持 OP 文本单条格式。 -
AddDict(idx, dict_info):单条字形入口,支持大漠文本格式,也支持FetchWord/GetDict返回的 OP 文本单条格式。
当当前字库为空时,Ocr/OcrEx/OcrAuto/OcrFromFile/OcrAutoFromFile 会走 OCR HTTP 服务;当当前字库有内容时,会优先使用本地点阵字库识别。
设置 OCR HTTP 引擎
long SetOcrEngine(path_of_engine,dll_name,argv)| 参数 | 类型 | 描述 |
|---|---|---|
| path_of_engine | string | OCR 后端别名或 URL,可传 tesseract、paddle
|
| dll_name | string | 兼容参数,也可以传 OCR URL |
| argv | string | 参数字符串,例如"--url=http://127.0.0.1:8081/api/v1/ocr --timeout=5000" |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.SetOcrEngine("paddle","","--timeout=5000")设置 YOLO HTTP 引擎
long SetYoloEngine(path_of_engine,dll_name,argv)| 参数 | 类型 | 描述 |
|---|---|---|
| path_of_engine | string | YOLO 后端别名或 URL,可传 yolo、yolo11 等 |
| dll_name | string | 兼容参数,也可以传 YOLO URL |
| argv | string | 参数字符串,支持 --url= 和 --timeout=
|
返回值
类型:int
- 0:失败
- 1:成功
示例
op.SetYoloEngine("http://127.0.0.1:8090","","--timeout=5000")检测屏幕区域中的目标
long YoloDetect(x1,y1,x2,y2,conf,iou,retjson)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| conf | double | 置信度阈值 |
| iou | double | NMS 的 IOU 阈值 |
| retjson | string* | 返回检测结果 JSON 字符串 |
返回值
类型:int
返回检测到的目标数量。请求失败、未绑定截图或检测失败时返回 0,retjson 为空。
示例
var retjson string
count = op.YoloDetect(0,0,800,600,0.25,0.45,&retjson)检测图片文件中的目标
long YoloDetectFromFile(file_name,conf,iou,retjson)| 参数 | 类型 | 描述 |
|---|---|---|
| file_name | string | 图片文件名 |
| conf | double | 置信度阈值 |
| iou | double | NMS 的 IOU 阈值 |
| retjson | string* | 返回检测结果 JSON 字符串 |
返回值
类型:int
返回检测到的目标数量。文件不存在、请求失败或检测失败时返回 0,retjson 为空。
示例
var retjson string
count = op.YoloDetectFromFile("screen.bmp",0.25,0.45,&retjson)加载文件字库到指定槽位。index 范围为 0-99,最多 100 个槽位。支持 OP 二进制字库和大漠文本点阵字库。
long SetDict(index,file)| 参数 | 类型 | 描述 |
|---|---|---|
| index | int | 字库的序号,取值为 0-99 |
| file | string | 字库文件名,支持 OP .dict 或大漠文本字库 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op_ret = op.SetDict(0,"test.txt")注:SetDict 加载的是文件字库,会写入进程级共享槽。多个 OP 对象使用同一个 index 时,可以复用这份文件字库;切换当前使用的槽位请调用 UseDict。文件导入时会优先按 OP 二进制字库读取,失败后按大漠文本点阵字库逐行解析。
把内存中的字库内容加载到指定槽位。该槽位会写入进程级共享字库,多个 OP 对象使用同一个 index 时可以直接复用。
long SetMemDict(idx,data)| 参数 | 类型 | 描述 |
|---|---|---|
| index | int | 字库的序号,取值为 0-99 |
| data | bytes | 字库内容数据,可为 OP .dict 文件字节、大漠文本字库内容或 OP 文本条目 |
注:C/C++ 原始指针接口为 SetMemDict(idx,data,size),需要额外传入字库字节数。Go、Python、COM 等绑定会自动取字节数组长度,不需要传 size。
返回值
类型:int
- 0:失败
- 1:成功
示例
// Go 示例:从内存加载字库文件
data, _ := os.ReadFile("test.dict")
op.SetMemDict(1, data)选择当前使用的字库槽位,index 范围为 0-99。
long UseDict(index)| 参数 | 类型 | 描述 |
|---|---|---|
| index | int | 字库的序号 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op_ret = op.UseDict(1)
ss = op.Ocr(0,0,2000,2000,"FFFFFF-000000",1.0)
op_ret = op.UseDict(0)
long UseDict(index)获取指定字库中的条目内容
string GetDict(idx,font_index)| 参数 | 类型 | 描述 |
|---|---|---|
| idx | int | 字库序号 |
| font_index | int | 条目序号 |
返回值
类型:string
返回字库条目字符串,失败返回空字符串
示例
dict_info = op.GetDict(0,0)向指定字库添加一条字库信息。dict_info 可以是 FetchWord/GetDict 返回的 OP 文本单条格式,也可以是大漠文本点阵单条格式。
如果该槽位原来来自 SetDict 的共享文件字库,第一次调用 AddDict 时会先复制一份到当前对象的私有槽,再追加新条目;这样不会修改其它对象正在使用的共享字库。
long AddDict(idx,dict_info)| 参数 | 类型 | 描述 |
|---|---|---|
| idx | int | 字库序号 |
| dict_info | string | 字库条目,可来自 FetchWord/GetDict,也可使用大漠文本格式 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.AddDict(0,"A$4,3,8$5E0E")保存指定字库到文件
long SaveDict(idx,file_name)| 参数 | 类型 | 描述 |
|---|---|---|
| idx | int | 字库序号 |
| file_name | string | 文件名 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.SaveDict(0,"test.dict")清空指定字库
long ClearDict(idx)| 参数 | 类型 | 描述 |
|---|---|---|
| idx | int | 字库序号 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.ClearDict(0)注:ClearDict 清空的是当前对象的私有槽,并会屏蔽该对象对同槽位共享文件字库的读取。其它 OP 对象不受影响。
获取指定字库中的字符数量
long GetDictCount(idx)| 参数 | 类型 | 描述 |
|---|---|---|
| idx | int | 字库序号 |
返回值
类型:int
返回字库条目数量
示例
count = op.GetDictCount(0)获取当前使用的字库序号
long GetNowDict()返回值
类型:int
返回当前字库序号
示例
idx = op.GetNowDict()设置点阵 OCR 的二值图预处理。它只在使用本地点阵字库时生效,会影响 Ocr/OcrEx/FindStr/FindStrEx 和点阵制作接口;走 HTTP OCR 服务时不生效。
这个接口主要用来清理文字二值图里的噪点,让找字更稳定。如果字很细或图本来很干净,不建议开太强,避免把有效笔画过滤掉。
| mode | 作用 | 适合场景 |
|---|---|---|
| 0 | 关闭预处理 | 图片干净、字体较细 |
| 1 | 去孤立噪点 | 字体边缘有零散点 |
| 2 | 去孤立噪点,并过滤小色块 | 背景有小块干扰 |
| 3 | 在 mode=2 基础上尝试连接轻微断笔 | 笔画有 1 像素断裂 |
long SetBinaryPreprocess(mode,isolated_threshold,min_component_area,bridge_gap)| 参数 | 类型 | 描述 |
|---|---|---|
| mode | int | 预处理模式,0 关闭,1 去孤立点,2 再过滤小连通域,3 在 2 的基础上允许补 1 像素断笔 |
| isolated_threshold | int | 孤立点判断阈值,范围 0-8 |
| min_component_area | int | 小连通域最小面积,小于该面积的前景块会被过滤 |
| bridge_gap | int | 是否尝试连接 1 像素断笔,0 关闭,非 0 开启 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.SetBinaryPreprocess(2,1,3,0)获取当前点阵二值图预处理参数。
long GetBinaryPreprocess(mode,isolated_threshold,min_component_area,bridge_gap)| 参数 | 类型 | 描述 |
|---|---|---|
| mode | int* | 返回当前预处理模式 |
| isolated_threshold | int* | 返回孤立点判断阈值 |
| min_component_area | int* | 返回小连通域最小面积 |
| bridge_gap | int* | 返回是否连接 1 像素断笔 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.GetBinaryPreprocess(mode, isolated_threshold, min_component_area, bridge_gap)根据指定范围和颜色描述,提取字库条目信息
string FetchWord(x1,y1,x2,y2,color,word)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| word | string | 字符名称 |
返回值
类型:string
返回可传给 AddDict 的字库条目,区域为空或失败时返回空字符串
示例
dict_info = op.FetchWord(0,0,20,20,"000000-000000","A")
op.AddDict(0,dict_info)根据指定范围、颜色和相似度,提取单个点阵字库条目。相比 FetchWord,该接口可以处理轻微色差或抗锯齿边缘。
string FetchWordEx(x1,y1,x2,y2,color,sim,word)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串,比如 `"FFFFFF-000000 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| word | string | 字符名称 |
返回值
类型:string
返回可传给 AddDict 的字库条目。区域为空、切图失败或没有前景点时返回空字符串。
示例
dict_info = op.FetchWordEx(0,0,20,20,"000000-202020",0.9,"A")
op.AddDict(0,dict_info)按颜色规则把指定区域里的点阵字块自动切出来。
string ExtractWordRects(x1,y1,x2,y2,color,sim,min_word_h)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| min_word_h | int | 字块最小高度,小于等于 0 时按 2 处理 |
返回值
类型:string
返回字块矩形列表,格式为 x1,y1,x2,y2|...。没有切出字块时返回空字符串。
示例
rects = op.ExtractWordRects(0,0,200,40,"ffffff-202020",0.9,8)按最小宽高和边距自动切出点阵字块,适合截图里夹杂小噪点或字形贴边的情况。
string ExtractWordRectsEx(x1,y1,x2,y2,color,sim,min_word_w,min_word_h,padding)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| min_word_w | int | 字块最小宽度,小于等于 0 时按 1 处理 |
| min_word_h | int | 字块最小高度,小于等于 0 时按 2 处理 |
| padding | int | 给每个字块额外保留的边距,小于 0 时按 0 处理 |
返回值
类型:string
返回字块矩形列表,格式为 x1,y1,x2,y2|...。
示例
rects = op.ExtractWordRectsEx(0,0,200,40,"ffffff-202020",0.9,2,8,1)自动切字,并按 words 的字符顺序生成多条点阵字库。切出的字块数量必须和 words 的字符数一致,否则返回空字符串。
string FetchWords(x1,y1,x2,y2,color,sim,words,min_word_h)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| words | string | 字符标签,顺序要和截图里从左到右切出的字块一致 |
| min_word_h | int | 字块最小高度 |
返回值
类型:string
返回多行字库文本,每行是一条字库。失败或数量不匹配时返回空字符串。
示例
dict_text = op.FetchWords(0,0,200,40,"ffffff-202020",0.9,"确定取消",8)使用更细的切字参数批量生成点阵字库。
string FetchWordsEx(x1,y1,x2,y2,color,sim,words,min_word_w,min_word_h,padding)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| words | string | 字符标签,数量必须和切出的字块数量一致 |
| min_word_w | int | 字块最小宽度 |
| min_word_h | int | 字块最小高度 |
| padding | int | 给每个字块额外保留的边距 |
返回值
类型:string
返回多行字库文本。失败或数量不匹配时返回空字符串。
示例
dict_text = op.FetchWordsEx(0,0,200,40,"ffffff-202020",0.9,"确定取消",2,8,1)按指定字块矩形生成多条点阵字库。rects 可以直接使用 ExtractWordRects 或 ExtractWordRectsEx 的返回值。
string FetchWordsByRects(x1,y1,x2,y2,color,sim,words,rects)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| words | string | 字符标签,数量必须和 rects 中的矩形数量一致 |
| rects | string | 字块矩形列表,格式为 `x1,y1,x2,y2 |
返回值
类型:string
返回多行字库文本。矩形数量和 words 数量不一致时返回空字符串。
示例
rects = op.ExtractWordRectsEx(0,0,200,40,"ffffff-202020",0.9,2,8,1)
dict_text = op.FetchWordsByRects(0,0,200,40,"ffffff-202020",0.9,"确定取消",rects)返回指定区域按颜色规则二值化后的文本预览,便于检查本地点阵 OCR 使用的前景点是否选对。
long GetBinaryPreview(x1,y1,x2,y2,color,sim,retstr)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| retstr | string* | 返回文本预览 |
返回值
类型:int
返回前景点数量。失败或没有前景点时返回 0。
retstr 第一行为 宽,高,后续每行是一行点阵,# 表示前景点,. 表示背景点。
示例
count = op.GetBinaryPreview(0,0,80,20,"ffffff-202020",0.9,preview)把单条字库文本转换成人眼可读的点阵预览。
long GetWordPreview(dict_info,retstr)| 参数 | 类型 | 描述 |
|---|---|---|
| dict_info | string | 单条字库文本,可来自 FetchWord/GetDict
|
| retstr | string* | 返回点阵预览 |
返回值
类型:int
- 0:字库条目无效
- 1:字库条目有效
retstr 第一行为 字名,宽,高,前景点数量,后续每行是点阵内容。
示例
ok = op.GetWordPreview(dict_info,preview)检查一段字库文本,统计其中合法的字库条目。
long CheckWordDict(dict_info,retstr)| 参数 | 类型 | 描述 |
|---|---|---|
| dict_info | string | 字库文本,支持多行 |
| retstr | string* | 返回每条记录的检查摘要 |
返回值
类型:int
返回合法条目数量。
retstr 每条记录用 | 分隔。合法记录格式为 行号,1,字名,宽,高,前景点数量,密度,非法记录格式为 行号,0,invalid。
示例
valid_count = op.CheckWordDict(dict_text,summary)清理字库文本,只保留合法条目,并统一输出为当前 OP 字库文本格式。
long NormalizeWordDict(dict_info,retstr)| 参数 | 类型 | 描述 |
|---|---|---|
| dict_info | string | 字库文本,支持多行 |
| retstr | string* | 返回规范化后的字库文本 |
返回值
类型:int
返回保留下来的合法条目数量。
示例
valid_count = op.NormalizeWordDict(raw_dict,normalized)按顺序替换字库条目的字名。适合批量切字后发现标签写错,需要统一改名的场景。
long RenameWordDict(dict_info,words,retstr)| 参数 | 类型 | 描述 |
|---|---|---|
| dict_info | string | 字库文本,支持多行 |
| words | string | 新字名,字符数量必须和合法字库条目数量一致 |
| retstr | string* | 返回重命名后的字库文本 |
返回值
类型:int
返回重命名成功的条目数量。字库为空或数量不一致时返回 0。
示例
count = op.RenameWordDict(dict_text,"确定取消",renamed)不依赖字库,识别指定范围内所有满足颜色条件的词块位置和点阵信息
string GetWordsNoDict(x1,y1,x2,y2,color)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
返回值
类型:string
返回格式为 x,y-word/x,y-word/
示例
result = op.GetWordsNoDict(0,0,200,200,"ffffff-000000")获取 GetWordsNoDict 结果中的词块数量
long GetWordResultCount(result)| 参数 | 类型 | 描述 |
|---|---|---|
| result | string | GetWordsNoDict 返回的字符串 |
返回值
类型:int
返回词块数量
示例
count = op.GetWordResultCount(result)获取 GetWordsNoDict 结果中指定词块的坐标
long GetWordResultPos(result,index,x,y)| 参数 | 类型 | 描述 |
|---|---|---|
| result | string | GetWordsNoDict 返回值 |
| index | int | 词块序号,从 0 开始 |
| x | int* | 变参指针: 返回 X 坐标 |
| y | int* | 变参指针: 返回 Y 坐标 |
返回值
类型:int
- 0:失败
- 1:成功
示例
op.GetWordResultPos(result,0,&x,&y)获取 GetWordsNoDict 结果中指定词块的内容
string GetWordResultStr(result,index)| 参数 | 类型 | 描述 |
|---|---|---|
| result | string | GetWordsNoDict 返回值 |
| index | int | 词块序号,从 0 开始 |
返回值
类型:string
返回词块内容,失败返回空字符串
示例
word = op.GetWordResultStr(result,0)识别屏幕范围(x1,y1,x2,y2)内符合 color_format 的字符串
若当前对象未设置字库,则使用 ocr 引擎进行文字识别
string Ocr(x1,y1,x2,y2,color_format,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color_format | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回识别到的字符串
示例
//RGB单色识别
s = op.Ocr(0,0,2000,2000,"9f2e3f-000000",1.0)
println(s)
//RGB单色差色识别
s = op.Ocr(0,0,2000,2000,"9f2e3f-030303",1.0)
println(s)
//RGB多色识别(最多支持10种,每种颜色用"|"分割)
s = op.Ocr(0,0,2000,2000,"9f2e3f-030303|2d3f2f-000000|3f9e4d-100000",1.0)
println(s)该方法可以返回识别到的字符串,以及每个字符的坐标
若当前对象未设置字库,则使用 ocr 引擎进行文字识别
string OcrEx(x1,y1,x2,y2,color_format,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color_format | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回识别到的字符串以及坐标
示例
和 Ocr 函数相同,只是结果处理有所不同 如下
op_ret = op.OcrEx(0,0,2000,2000,"ffffff|000000",1.0)
ss = split(op_ret,"|")
index = 0
count = UBound(ss) + 1
Do While index < count
TracePrint ss(index)
sss = split(ss(index),"$")
ocr_s = int(sss(0))
x = int(sss(1))
y = int(sss(2))
TracePrint ocr_s & ","&x&","&y
index = index+1
Loop识别屏幕范围(x1,y1,x2,y2)内的字符串,自动二值化,不需要指定颜色
适用于字体颜色和背景相差较大的场合
string OcrAuto(x1,y1,x2,y2,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回识别到的字符串
示例
s = op.OcrAuto(0,0,100,200,1.0)
println(s)从文件中识别图片
string OcrFromFile(file_name,color_format,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| file_name | string | 文件名 |
| color_format | string | 颜色格式串 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回识别到的字符串
示例
//RGB单色识别
s = op.OcrFromFile("test.png","9f2e3f-000000",1.0)
println(s)从文件中识别图片,自动二值化,不需要指定颜色
string OcrAutoFromFile(file_name,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| file_name | string | 文件名 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回识别到的字符串
示例
//RGB单色识别
s = op.OcrAutoFromFile("test.png",1.0)
println(s)在屏幕范围(x1,y1,x2,y2)内查找字符串,并返回符合 color_format 的坐标位置
long FindStr(x1,y1,x2,y2,string,color_format,sim,intX,intY)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| string | string | 待查找的字符串,支持用 "|" 分隔多个候选项,比如"长安|洛阳|大雁塔" |
| color_format | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| sim | double | 相似度,取值范围 0.1-1.0 |
| intX | int* | 变参指针: 返回 X 坐标没找到返回-1 |
| intY | int* | 变参指针: 返回 Y 坐标没找到返回-1 |
返回值
类型:int
返回字符串的索引 没找到返回-1, 比如"长安|洛阳",若找到长安,则返回 0
示例
此函数的原理是先 Ocr 识别,然后再查找,若当前对象未设置字库,则使用 ocr 引擎进行文字识别
op_ret = op.FindStr(0,0,2000,2000,"长安","9f2e3f-000000",1.0,intX,intY)
If intX >= 0 and intY >= 0 Then
op.MoveTo intX,intY
End If
op_ret = op.FindStr(0,0,2000,2000,"yes|no","ffffff-000000",1.0,intX,intY)
If intX >= 0 and intY >= 0 Then
op.MoveTo intX,intY
End If
在屏幕范围(x1,y1,x2,y2)内查找字符串
该接口和 FindStr 类似,可以返回符合 color_format 的所有坐标位置
string FindStrEx(x1,y1,x2,y2,string,color_format,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| string | string | 待查找的字符串,支持用 "|" 分隔多个候选项,比如"长安|洛阳|大雁塔" |
| color_format | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回所有找到的坐标集合,格式如下: "id,x0,y0|id,x1,y1|......|id,xn,yn" 比如"0,100,20|2,30,40" 表示找到了两个,第一个,对应的是序号为 0 的字符串,坐标是(100,20),第二个是序号为 2 的字符串,坐标(30,40)
示例
此函数的原理是先 Ocr 识别,然后再查找,若当前对象未设置字库,则使用 ocr 引擎进行文字识别
op_ret = op.FindStrEx(0,0,2000,2000,"伤害|攻击|血量","eeddff-000000",1.0)
If len(op_ret) > 0 Then
ss = split(op_ret,"|")
index = 0
count = UBound(ss) + 1
Do While index < count
TracePrint ss(index)
sss = split(ss(index),",")
id = int(sss(0))
x = int(sss(1))
y = int(sss(2))
op.MoveTo x,y
Delay 1000
index = index+1
Loop
End If在指定的屏幕坐标范围内,查找指定颜色的直线
string FindLine(x1,y1,x2,y2,color_format,sim)| 参数 | 类型 | 描述 |
|---|---|---|
| x1 | int | 区域的左上 X 坐标 |
| y1 | int | 区域的左上 Y 坐标 |
| x2 | int | 区域的右下 X 坐标 |
| y2 | int | 区域的右下 Y 坐标 |
| color_format | string | 颜色格式串,比如"FFFFFF-000000|CCCCCC-000000"每种颜色用"|"分割 |
| sim | double | 相似度,取值范围 0.1-1.0 |
返回值
类型:string
返回直线描述。结果包含直线角度和距离等信息,失败时返回空字符串。
示例
ret = op.FindLine(0,0,300,300,"ffffff-202020",0.9)