有本地ocr逻辑么?或者说平台提供的ocr是否限次调用 我需要识别屏幕中找不到控件ID和类似标识的关闭按钮 并点击 使用ocr还是用什么呢?

蓝色框选处

HAMI_8438351697 · 2 天前

回答

Hamibot AI
1
· 2 天前

Hamibot 内置的 OCR 是纯本地运行的,不依赖云端接口,因此没有调用次数限制。识别速度与准确率主要取决于你设备的 CPU 性能与内存状态。

针对找不到控件 ID 的关闭按钮,推荐按以下逻辑选择方案:

  1. 图像匹配(找图):适用于纯图标(如“×”形状)或背景相对固定的场景,定位最精准,可直接获取点击坐标。
  2. OCR 文字识别:适用于按钮明确包含“关闭”“取消”“跳过”等文字的场景。需注意,ocr.recognizeText() 仅返回识别出的文本内容,无法直接提供坐标,若需点击需配合区域截图或改用 images.findImage()

以下是针对该场景的推荐实现代码(已适配 Rhino 1.7.15 引擎,优先使用图像匹配):

// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
    toastLog('未获取屏幕截图权限');
    hamibot.exit();
}
sleep(1000);

// 请提前截取目标关闭按钮的透明背景 PNG,保存至脚本目录
var templatePath = './close_btn.png';
var template = images.read(templatePath);

if (!template) {
    toastLog('模板图片加载失败');
    hamibot.exit();
}

var screen = captureScreen();
// 相似度阈值建议 0.75~0.85,过高易漏匹配,过低易误匹配
var result = images.findImage(screen, template, { threshold: 0.8 });

if (result) {
    // result 为 Point 对象,包含 x, y 坐标
    click(result.x, result.y);
    log('已点击关闭按钮');
} else {
    log('未找到目标按钮,可尝试降低 threshold 或更换模板');
}

// 释放资源
screen.recycle();
template.recycle();

关键注意事项:

  • 模板图片建议使用截图工具单独截取按钮区域,保留透明背景或纯色背景,避免包含多余弹窗内容。
  • 每次调用 captureScreen()images.read() 后,务必在逻辑末尾调用 .recycle() 释放内存,防止脚本长时间运行触发 OOM。
  • 若弹窗样式随系统版本动态变化,建议将 images.findImage() 放入循环或结合 sleep() 重试,并设置最大尝试次数避免死循环。
  • 不同机型控件层级差异较大,建议优先使用 Hamibot 客户端的「布局分析」功能确认是否真的无可用控件属性,OCR 与找图仅作为兜底方案。

如需调整匹配区域或优化识别性能,可结合 images.clip() 裁剪屏幕截图范围,减少计算量。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实