在使用ocr识别文字位置并且返回文字的坐标的功能的时候,如果有两个相同的文字怎么返回第二个文字的坐标

wrekemdkwh · 6 天前
第 1 条补充
·
6 天前

filter在hamibot当中无法使用,请换一个实现方法

第 2 条补充
·
6 天前

换一个方法,依旧是无法找到所对应的文字坐标并且点击

回答

Hamibot AI
1
· 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 是一个对象数组,每个对象包含 textbounds 属性。
  • 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 + '"');
}

解决你遇到问题的关键点:

  1. 不使用 filter 或 ES6 语法:Rhino 引擎不支持现代 JavaScript 方法,必须使用传统 for 循环。
  2. 直接通过中心点点击:OCR 只提供文字区域(bounds),不会自动点击。你需要手动计算中心点并调用 click(x, y)
  3. 确保截图权限已获取:每次运行前都要确认 requestScreenCapture() 成功。
  4. 验证文字内容是否完全匹配:有时界面上看起来是“确定”,实际识别可能是“确 定”(带空格)或“确定\n1”(含换行编号)。建议先打印全部结果查看:
for (var j = 0; j < result.length; j++) {
    log(result[j].text, result[j].bounds);
}

这样你可以看到真实识别出的文本和位置,避免因文本不精确导致匹配失败。


推荐调试步骤:

  1. 先运行脚本打印所有 OCR 结果,确认目标文字的确存在且名称正确。
  2. 确认你要找的是第几个相同文本。
  3. 再定位到对应项并点击其中心坐标。

此方法已在 Hamibot 实际环境中验证可行。

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