RapidOCR:高性能文字识别方案
AScript 深度集成 RapidOCR (PaddleOCR V4/V5 内核),并对返回结果集进行了 运行时对象化注入。
- 性能卓越:基于 ONNXRuntime 加速,毫秒级响应。
- 语义交互:支持
.find().click()链式操作,无需手动计算坐标。 - 健壮性:内置 Null 对象保护模式,规避文字未匹配时的崩溃风险。
1. 环境准备
在使用 OCR 之前,请确保你的项目中已包含以下依赖,否则将影响分发。
依赖引入
# pyproject.toml
dependencies = [
"ascript",
"rapidocr==3.5.0",
"onnxruntime==1.23.2"
]
Pip 安装依赖库
pip install rapidocr onnxruntime
图形工具预览
通过 AScript 提供的图形化工具,你可以直观地预览识别效果并生成代码。

2. 识别模式
- 窗口识别
- 全屏识别
针对特定窗口进行截图识别。AScript 会自动处理窗口内相对坐标,确保点击位置精准对齐。
from rapidocr import RapidOCR
from ascript.windows.window import Window
# 1. 找到目标窗口
win = Window.find("微软电脑管家")
engine = RapidOCR()
# 2. 链式调用:截图 -> 识别 -> 查找文本 -> 点击
engine(win.capture()).find("立即加速").click(win)
适用于跨窗口或桌面级的视觉自动化,获取全屏绝对坐标。
from rapidocr import RapidOCR
from ascript.windows.screen import Screen
engine = RapidOCR()
# 获取全屏截图并识别
result = engine(Screen.capture())
# 查找并执行全屏点击
result.find("我的电脑").click()
3. 链式调用 API 详解
AScript 通过 Hook 机制,为 RapidOCR 的返回结果注入了强大的链式操作能力。
.find() —— 查找单个目标
在识别结果中定位第一个匹配的文字项。
方法签名:
find(text_re: str = None, score: float = 0.85) -> OCRItem
- text_re (str): 目标文本或正则表达式。若为
None,则返回结果集中的第一个项。 - score (float): 置信度阈值(0~1)。只有识别分数高于此值的项才会被匹配。默认为
0.85。 - 返回:匹配成功返回
OCRItem;失败则返回NullOCRItem。
.find_all() —— 批量查找
获取所有符合条件的文字项。
方法签名:
find_all(text_re: str = None, score: float = 0.85) -> List[OCRItem]
- 排序逻辑:返回的列表已内置排序,优先按坐标 从上到下 排序,次优先按 从左到右 排序。
.click() —— 执行交互
直接点击识别到的文字中心点。
方法签名:
click(window: Window = None) -> OCRItem
- window (Window):
- 传入:执行窗口内相对坐标点击(推荐在窗口截图模式下使用)。
- 不传:执行全屏绝对坐标点击(推荐在全屏截图模式下使用)。
4. 实战案例
案例一:正则匹配与精准点击
利用正则表达式处理动态文本,例如匹配“本地磁盘 (C:)”或“本地磁盘 (D:)”。
from rapidocr import RapidOCR
from ascript.windows.window import Window
win = Window.find("微软电脑管家")
engine = RapidOCR()
# 使用正则匹配任意磁盘标识并点击
win_ocr = engine(win.capture())
win_ocr.find(r"本地磁盘.*", score=0.9).click(win)
案例二:安全链式调用(空对象保护)
即使界面还没加载出“登录”按钮,这段代码也不会报错,它会静默跳过点击。
# 极致安全的链式操作
engine(win.capture()).find("登录").click(win)
案例三:遍历并处理多个目标
获取所有识别到的项,并过滤出包含特定关键词的内容进行操作。
result = engine(win.capture())
# 找出所有包含 "清理" 关键字且分数高的项
targets = result.find_all(text_re="清理", score=0.9)
for item in targets:
print(f"正在准备点击: {item.txt}")
item.click(win)
开发者笔记
- 链式调用的灵魂:
find()失败后返回的NullOCRItem同样拥有click()方法,只是它什么都不会做。这保证了你的脚本在复杂的 UI 变化中具备极高的稳定性。 - 性能建议:如果只需要识别窗口内的一小块区域,请使用
win.capture(rect=[l, t, r, b])进行局部截图,这能显著降低 OCR 的解析耗时。