文字识别OCR怎么用?识别完成之后,我需要进行点击操作,如何进行点击?例如说,我要点击文字那一类
可是它无法识别,然后且无法正常点击
log('开始截屏');
const img = captureScreen();
toastLog('开始识别');
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);
const cimg = captureScreen();
images.grayscale(cimg); // 转为灰度图,提升识别效果
const textResult = ocr.recognizeText(cimg);
toastLog('识别结果:' + textResult);
运行时会冲突咋办?
回答
在 Hamibot 中,你可以使用 OCR 文字识别来识别图片中的文字,然后通过点击操作来实现对识别到的文字进行点击。以下是具体步骤:
1. 获取屏幕截图并进行 OCR 识别
首先,你需要获取屏幕截图,并使用 ocr.recognizeText 或 ocr.recognize 函数来识别图片中的文字。
// 文档地址 https://docs.hamibot.com/
auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit(); // 权限未授予则退出
}
sleep(1000);
log('开始截屏');
const img = captureScreen();
toastLog('开始识别');
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);
2. 根据识别结果进行点击操作
如果识别到的文字是你可以点击的文本(例如按钮、菜单项等),可以使用 click(text) 函数进行点击。例如,如果你识别到了“扫一扫”文字,可以尝试点击它。
// 尝试点击“扫一扫”文字
while (!click('扫一扫')) {
// 如果未找到或无法点击,等待一段时间后重试
sleep(1000);
}
3. 如果需要点击特定区域
如果识别到的文字所在的区域不能直接点击,或者你希望点击某个特定区域,可以使用 click(left, top, bottom, right) 函数。你需要通过布局分析工具获取控件的 bounds 属性,然后根据这个区域进行点击。
// 假设你已经通过布局分析工具获取了点击区域的坐标
// left: 左边与屏幕左边的距离
// top: 上边与屏幕上边的距离
// bottom: 下边与屏幕下边的距离
// right: 右边与屏幕右边的距离
click(100, 200, 300, 400);
注意事项
click(text)函数会尝试点击屏幕上所有匹配的文本,如果存在多个相同文本,可以通过click(text, i)指定点击第几个。click(left, top, bottom, right)通常用于录制的脚本中,自己编写的代码中尽量避免使用。- 如果识别到的文字是图标或其他非文本元素,建议使用布局分析工具定位点击区域。
通过以上步骤,你可以实现 OCR 文字识别后的点击操作。如果有其他问题,欢迎继续提问!
补充回答 1
如果 OCR 无法识别文字,或者识别后无法正常点击,可能是以下几个原因导致的。你可以根据以下步骤进行排查和优化:
1. 检查屏幕截图权限是否已正确授予
Hamibot 的 OCR 功能依赖于屏幕截图权限,如果没有正确授权,可能导致无法截屏或识别失败。
// 文档地址 https://docs.hamibot.com/
auto.waitFor(); // 等待无障碍服务
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit(); // 权限未授予则退出
}
如果提示“没有授予 Hamibot 屏幕截图权限”,请手动打开手机设置 -> 应用管理 -> Hamibot -> 权限,确保“无障碍服务”和“悬浮窗权限”已经开启。
2. 检查图片是否清晰、文字是否可识别
OCR 识别准确率与图片质量密切相关,建议:
- 保证图片清晰,无模糊或反光。
- 文字大小适中,背景不要过于复杂。
- 可以尝试对图片进行灰度处理,提升识别效果。
const img = captureScreen();
images.grayscale(img); // 转为灰度图,提升识别效果
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);
3. 使用 ocr.recognize 获取详细识别信息
有时候 ocr.recognizeText 只返回纯文本,但可能不包含坐标等信息。可以使用 ocr.recognize 获取更详细的识别结果,然后根据坐标进行点击。
const result = ocr.recognize(img); // 返回带坐标的详细信息
log(result);
// 假设识别到的文字在某个区域,可以通过坐标点击
if (result && result.length > 0) {
const { left, top, right, bottom } = result[0].bounds;
click(left, top, bottom, right); // 根据坐标点击
}
4. 使用 click(text) 或 click(text, i) 点击文字
如果识别到的文字是可点击的(例如按钮、菜单项),可以直接使用 click(text) 函数。
while (!click('扫一扫')) {
sleep(1000); // 如果未找到,等待重试
}
如果存在多个相同文字,可以通过 i 参数指定点击第几个:
click('确定', 0); // 点击第一个“确定”
5. 使用布局分析工具定位控件
如果 OCR 无法识别,或者点击无效,可以使用 Hamibot 的布局分析工具,通过查看控件的 bounds 属性来直接点击特定区域。
- 打开 Hamibot 悬浮窗,进入“布局分析”功能。
- 点击屏幕上的目标控件,获取其
bounds值(即左、上、右、下)。 - 在脚本中使用
click(left, top, right, bottom)进行点击。
// 示例:点击一个控件,假设 bounds 是 [100, 200, 300, 400]
click(100, 200, 300, 400);
6. 错误处理和调试
添加异常捕获逻辑,防止程序因识别失败而崩溃。
try {
const textResult = ocr.recognizeText(img);
toastLog('识别结果:' + textResult);
} catch (e) {
toastLog('识别失败:' + e);
}
7. 优化性能
如果识别速度慢或占用资源高,可以尝试以下优化:
-
缩放图片:
const img = images.resize(captureScreen(), [200, 300]); // 缩小图片 -
对图片进行灰度处理:
images.grayscale(img); // 转为灰度图
总结
如果 OCR 无法识别或无法点击,建议按以下顺序排查:
- 确保权限已正确授予。
- 检查图片质量和文字清晰度。
- 使用
ocr.recognize获取详细识别信息,并根据坐标点击。 - 使用
click(text)或click(text, i)直接点击文字。 - 使用布局分析工具获取控件的
bounds并进行点击。 - 添加异常捕获逻辑,避免脚本中断。
如果你还有问题,可以提供具体的
补充回答 2
你提到的代码中存在一个变量名冲突的问题。在代码中,你第一次调用了 ocr.recognizeText(img),并将结果赋值给 textResult。接着又定义了一个新的变量 cimg,并再次使用 textResult 作为变量名,这会导致错误。
❌ 错误原因
const textResult = ocr.recognizeText(img); // 第一次赋值
...
const textResult = ocr.recognizeText(cimg); // 第二次赋值,覆盖了之前的 textResult
JavaScript 中不允许在同一作用域内重复声明同一个变量名(除非使用 var)。因此,第二次定义 textResult 会报错。
✅ 正确写法
你可以将第二次识别的结果赋值给另一个变量,比如 textResultGrayscale,避免变量名冲突。
// 文档地址 https://docs.hamibot.com/
log('开始截屏');
const img = captureScreen();
toastLog('开始识别');
const textResult = ocr.recognizeText(img);
toastLog('原始图片识别结果:' + textResult);
const cimg = captureScreen();
images.grayscale(cimg); // 转为灰度图,提升识别效果
const textResultGrayscale = ocr.recognizeText(cimg);
toastLog('灰度图识别结果:' + textResultGrayscale);
其他建议
- 如果你想对同一张截图进行灰度处理后再识别,可以将
captureScreen()的结果直接传给images.grayscale()。 - 如果你希望只对一张图片做灰度处理并识别,可以这样做:
const img = captureScreen();
images.grayscale(img); // 直接对原图进行灰度处理
const textResult = ocr.recognizeText(img);
toastLog('灰度图识别结果:' + textResult);
总结
变量名重复会导致脚本运行失败,建议使用不同的变量名来保存不同阶段的识别结果。如果你还有其他问题,欢迎继续提问!