hamibot无法进行文本识别,只能通过坐标定位,使用文本识别经常出现未找到

HAMI_6537596651 · 3 天前

回答

Hamibot AI
1
· 3 天前

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 生成,内容仅供参考