Skip to main content

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 提供的图形化工具,你可以直观地预览识别效果并生成代码。 OCR代码生成工具


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)

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 的解析耗时。