在使用ocr识别文字位置并且返回文字的坐标的功能的时候,如果有两个相同的文字怎么返回第二个文字的坐标
第 1 条补充
· 6 天前
filter在hamibot当中无法使用,请换一个实现方法
第 2 条补充
· 6 天前
换一个方法,依旧是无法找到所对应的文字坐标并且点击
回答
在使用 Hamibot 的 OCR 识别功能时,ocr.recognize(img) 会返回一个包含所有识别出的文字及其坐标的详细结果数组。每个识别项都包含了文本内容和对应的位置信息(如 bounding box 的坐标)。
如果有多个相同的文字(例如两个“确定”按钮),你可以通过遍历 ocr.recognize() 返回的结果数组,找到所有匹配该文本的条目,并根据索引获取第二个匹配项的坐标。
示例代码:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit();
}
const img = captureScreen();
const result = ocr.recognize(img);
// 查找所有文本为 "确定" 的结果
const matches = result.filter(item => item.text === '确定');
if (matches.length >= 2) {
const secondMatch = matches[1]; // 第二个匹配项(索引为1)
log('第二个"确定"的坐标:', secondMatch.bounds);
} else {
toastLog('未找到第二个"确定"');
}
说明:
result是一个对象数组,每个对象包含text和bounds属性。bounds是一个矩形区域对象,包含left,top,right,bottom,可用于后续点击或区域判断。- 使用
filter提取所有匹配文本的项,再通过索引[1]获取第二个实例。
这样就可以准确获取相同文字中第二个的坐标信息。
补充回答 1
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit();
}
const img = captureScreen();
const result = ocr.recognize(img);
var count = 0;
var secondMatch = null;
for (var i = 0; i < result.length; i++) {
if (result[i].text === '确定') {
count++;
if (count === 2) {
secondMatch = result[i];
break;
}
}
}
if (secondMatch) {
log('第二个"确定"的坐标:', secondMatch.bounds);
} else {
toastLog('未找到第二个"确定"');
}
说明:
由于 Hamibot 使用的是 Rhino 1.7.15 引擎,部分现代 JavaScript 方法(如 filter、箭头函数)不被支持。因此使用标准的 for 循环和变量计数来遍历 OCR 结果。
- 遍历
result数组,查找文本为"确定"的项。 - 用
count记录匹配次数,当第二次匹配时,保存该对象并退出循环。 - 最终返回第二个匹配项的坐标信息
bounds。
此方法兼容性强,适用于 Hamibot 当前的脚本运行环境。
补充回答 2
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('请授予屏幕截图权限!');
hamibot.exit();
}
// 截图并执行 OCR 识别
const img = captureScreen();
const result = ocr.recognize(img);
var targetText = "确定";
var foundIndex = 0;
// 手动遍历结果,查找第二个匹配的文本
for (var i = 0; i < result.length; i++) {
if (result[i].text === targetText) {
foundIndex++;
if (foundIndex === 2) { // 找到第二个实例
var bounds = result[i].bounds;
var centerX = (bounds.left + bounds.right) / 2;
var centerY = (bounds.top + bounds.bottom) / 2;
// 输出坐标信息
log('第二个 "' + targetText + '" 的区域:', bounds);
log('点击位置:', [centerX, centerY]);
// 执行点击
click(centerX, centerY);
break;
}
}
}
if (foundIndex < 2) {
toastLog('未找到第二个 "' + targetText + '"');
}
解决你遇到问题的关键点:
- 不使用
filter或 ES6 语法:Rhino 引擎不支持现代 JavaScript 方法,必须使用传统for循环。 - 直接通过中心点点击:OCR 只提供文字区域(
bounds),不会自动点击。你需要手动计算中心点并调用click(x, y)。 - 确保截图权限已获取:每次运行前都要确认
requestScreenCapture()成功。 - 验证文字内容是否完全匹配:有时界面上看起来是“确定”,实际识别可能是“确 定”(带空格)或“确定\n1”(含换行编号)。建议先打印全部结果查看:
for (var j = 0; j < result.length; j++) {
log(result[j].text, result[j].bounds);
}
这样你可以看到真实识别出的文本和位置,避免因文本不精确导致匹配失败。
推荐调试步骤:
- 先运行脚本打印所有 OCR 结果,确认目标文字的确存在且名称正确。
- 确认你要找的是第几个相同文本。
- 再定位到对应项并点击其中心坐标。
此方法已在 Hamibot 实际环境中验证可行。
ℹ️ 本回答由 AI 生成,内容仅供参考