如何使用图片识别来识别控件

已存档
falymueji3 · 2 个月前
第 1 条补充
·
2 个月前

11:51:05.007/E: Wrapped java.lang.SecurityException: No screen capture permission (<init>#29)
Wrapped java.lang.SecurityException: No screen capture permission

回答

Hamibot AI
1
· 2 个月前

文档地址 https://docs.hamibot.com/

使用图片识别来识别控件是 Hamibot 自动化工具的一个重要功能,以下是一个基本的实现步骤和示例代码:

1. 准备工作

确保你的脚本已经申请了屏幕截图权限:

auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
    toastLog('请授予屏幕截图权限!');
    hamibot.exit(); // 权限未授予则退出
}

2. 截取屏幕并进行 OCR 识别

通过 captureScreen() 截取当前屏幕图像,然后使用 OCR 识别图像中的文字信息:

// 截取当前屏幕
const img = captureScreen();

// 识别图片中的文字(返回带坐标的详细信息)
const result = ocr.recognize(img);
log(result);

// 仅获取纯文本内容
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);

3. 识别特定区域

如果你只需要识别某个特定区域内的文字,可以使用 images.clip 截取指定区域:

// 截取指定区域(参数:左,上,右,下)
const regionImg = images.clip(img, 100, 200, 500, 400);

// 识别区域文字
const areaText = ocr.recognizeText(regionImg);
log('区域识别结果:', areaText);

4. 实际应用场景示例

场景 1:识别验证码

// 截取验证码区域
const codeImg = images.clip(captureScreen(), 300, 500, 600, 600);
const verifyCode = ocr.recognizeText(codeImg);
log('验证码内容:' + verifyCode);

场景 2:自动化表单填写

// 识别输入框文字
const inputText = ocr.recognizeText(
    images.clip(captureScreen(), 50, 300, 400, 350)
);
if (inputText.includes('请输入手机号')) {
    // TODO 填入输入框
}

5. 注意事项

  • 准确率影响因素:图片清晰度、文字字体/大小、背景复杂度等都会影响识别准确率。
  • 性能优化建议
    • 使用 images.resize() 调整图片大小以加快识别速度。
    • 使用 images.grayscale() 将图片转为灰度图,提高识别效率。
  • 错误处理:建议用 try...catch 捕获异常,避免程序因识别失败而崩溃。

6. 结合控件选择器(UiSelector)定位元素

OCR 可以与 UiSelector 配合使用,例如先通过 OCR 识别目标控件的文字信息,再结合 UiSelector 定位并操作该控件。这种方式可以用于实现更复杂的自动化流程。

通过上述方法,你可以有效地利用图片识别技术在 Hamibot 中定位和操作控件。


补充回答 1

文档地址 https://docs.hamibot.com/

这个错误信息表明脚本没有获得 Hamibot 的屏幕截图权限,导致调用截图相关功能时抛出了 SecurityException 异常。

解决方案

1. 请求截图权限

在脚本开头使用以下代码请求截图权限,并确保用户已授予:

auto.waitFor(); // 等待无障碍服务启动
if (!requestScreenCapture()) {
    toastLog("请先授予屏幕截图权限!");
    hamibot.exit(); // 没有权限则退出脚本
}

2. 手动开启权限

如果脚本运行后仍然提示权限问题,请手动检查并开启截图权限:

  • 打开 Hamibot 应用;
  • 进入脚本详情页;
  • 点击【启用截图权限】按钮(或类似选项);
  • 在系统弹窗中选择“允许”以授予截图权限。

3. 延迟执行截图操作

截图权限申请成功后,设备需要一定时间初始化截图功能。建议在申请权限后添加延迟再进行截图操作:

sleep(1000); // 等待 1 秒后再截图
var img = captureScreen();

4. 完整示例

下面是一个完整的请求截图权限和截取屏幕的示例脚本:

auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
    toastLog("请授予屏幕截图权限!");
    hamibot.exit();
}
sleep(1000); // 等待截图权限生效
var img = captureScreen(); // 截取当前屏幕
toastLog("截图完成");
hamibot.exit();

5. 其他注意事项

  • 如果你使用的是横屏应用,请改用 requestScreenCapture(true) 来请求横屏截图。
  • 某些设备或系统版本可能对截图功能有限制,请尝试重启 Hamibot 或设备。

如果你仍有问题,可以发送邮件到 support@hamibot.cn 获取进一步帮助。

ℹ️ 本回答由 AI 生成,内容仅供参考