回答
Hamibot 文本识别(OCR)不稳定或无法找到文字,通常由权限配置、截图时机、识别区域过大或文字特征不明显导致。以下是排查步骤和优化方案:
1. 检查屏幕截图权限
OCR 功能依赖屏幕截图。脚本运行时必须确保已授予 Hamibot 屏幕截图权限。
- 在脚本开头调用
requestScreenCapture()。 - 确保弹窗提示时点击“立即开始”。
- 如果返回
false,脚本应停止执行以避免后续错误。
2. 优化截图时机与质量
屏幕内容渲染需要时间,立即截图可能导致获取到空白或旧画面。
- 在
requestScreenCapture()后增加sleep(1000)等待。 - 确保目标文字在截图时完全显示,未被遮挡。
- 文字与背景对比度越高,识别率越高。
3. 缩小识别区域
全屏幕识别速度慢且容易受干扰。如果知道文字的大致位置,建议先裁剪图片或指定区域。
- 虽然
ocr模块本身主要接收图片对象,你可以结合images模块处理图片区域。 - 减少无关背景噪音能提高准确率。
4. 采用混合定位策略
单纯依赖 OCR 可能因字体、颜色变化失效。建议结合 images.findColor 或坐标定位作为备选方案。
- 优先尝试 OCR 识别。
- 如果 OCR 返回为空,降级使用找色或固定坐标。
- 这种混合模式能显著提高脚本稳定性。
5. 代码示例
以下脚本展示了如何结合权限检查、截图等待、OCR 识别以及找色备选方案。注意代码兼容 Rhino 1.7.15 引擎,未使用箭头函数。
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
// 1. 请求屏幕截图权限
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
// 2. 等待界面渲染
sleep(1000);
// 3. 捕获屏幕
var img = captureScreen();
if (!img) {
toastLog('截图失败');
hamibot.exit();
}
// 4. 尝试 OCR 识别
var textResult = ocr.recognizeText(img);
log('OCR 结果:' + textResult);
var targetFound = false;
// 判断是否包含目标文字
if (textResult && textResult.indexOf('目标文字') > -1) {
toastLog('OCR 识别成功');
targetFound = true;
} else {
toastLog('OCR 未找到,尝试找色备用方案');
// 5. 备用方案:区域找色
// 在指定区域寻找特定颜色,临界值设为 4
var point = images.findColor(img, '#ff0000', {
region: [400, 500, 300, 200],
threshold: 4
});
if (point) {
toastLog('找色成功:' + point.x + ', ' + point.y);
click(point.x, point.y);
targetFound = true;
}
}
if (!targetFound) {
toastLog('所有方案均未找到目标');
}
// 释放图片资源
img.recycle();
hamibot.exit();
6. 其他建议
- 日志调试:使用
log()输出 OCR 返回的具体内容,确认是返回空值还是识别成了乱码。 - 环境差异:不同手机屏幕分辨率和 DPI 可能影响识别,建议在相同设备上调试。
- 动态内容:如果文字是动态加载的,增加循环检测机制,每隔一段时间截图识别一次。
如果上述优化后问题依旧,建议检查目标文字是否为图片形式而非可识别文本,或联系服务支持获取进一步协助。
ℹ️ 本回答由 AI 生成,内容仅供参考