You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tesseract/Tess4j v5+中getBoxText废弃后,如何获取文本所在矩形?

在Tesseract/Tess4j v5+中替代废弃的getBoxText()获取文本矩形区域的方案

在Tesseract/Tess4j v5.0及以后版本,getBoxText()方法已被废弃,要获取目标文本对应的矩形区域,需要获取包含位置信息的完整OCR识别结果,再从中筛选匹配的文本块。以下是替换原代码的实现方案:

修改后的完整代码

String extractedText = tesseract.doOCR(screenShot);
System.out.println("当前屏幕截图识别出的文本: " + extractedText);

// 检查目标文本是否存在
if (extractedText.contains(textElement)) {
    System.out.println("找到目标文本元素!");

    // 获取带位置信息的所有识别单词
    List<Word> words = tesseract.getWords(screenShot, ITessAPI.TessPageIteratorLevel.RIL_WORD);
    Rectangle textRectangle = null;

    // 遍历单词,匹配目标文本
    for (Word word : words) {
        if (word.getText().equals(textElement)) {
            textRectangle = word.getBoundingBox();
            break;
        }
    }

    // 如果找到对应矩形,执行点击操作
    if (textRectangle != null) {
        // 计算中点坐标
        int x = textRectangle.x + textRectangle.width / 2;
        int y = textRectangle.y + textRectangle.height / 2;
        System.out.println("点击位置坐标(x,y): " + x + "," + y);
        Actions actions = new Actions(driver);
        actions.moveToLocation(x, y).click().perform();
    } else {
        System.out.println("未找到目标文本对应的精确位置!");
    }
} else {
    System.out.println("未找到目标文本元素!");
}

关键说明

  • 使用getWords()方法获取所有识别出的单词,每个Word对象包含文本内容和对应的BoundingBox(矩形区域)。
  • ITessAPI.TessPageIteratorLevel.RIL_WORD指定按单词级别获取结果,你也可以根据需求改为RIL_CHAR(字符级别)或RIL_TEXTLINE(行级别)。
  • 如果目标文本是由多个连续单词组成的短语,需要遍历单词列表,拼接连续单词后匹配目标文本,再合并对应的矩形区域(取所有单词矩形的最小外接矩形)。

多单词短语的适配示例

如果目标文本是多单词组合,比如"Hello World",可以这样处理:

String targetPhrase = "Hello World";
List<Word> words = tesseract.getWords(screenShot, ITessAPI.TessPageIteratorLevel.RIL_WORD);
Rectangle textRectangle = null;

// 遍历寻找连续匹配的单词
for (int i = 0; i < words.size(); i++) {
    StringBuilder sb = new StringBuilder();
    int startIndex = i;
    // 从当前位置开始拼接单词,直到匹配目标短语或超出列表
    while (startIndex < words.size()) {
        sb.append(words.get(startIndex).getText()).append(" ");
        String currentPhrase = sb.toString().trim();
        if (currentPhrase.equals(targetPhrase)) {
            // 计算所有匹配单词的最小外接矩形
            int minX = Integer.MAX_VALUE;
            int minY = Integer.MAX_VALUE;
            int maxX = Integer.MIN_VALUE;
            int maxY = Integer.MIN_VALUE;
            for (int j = i; j <= startIndex; j++) {
                Rectangle rect = words.get(j).getBoundingBox();
                minX = Math.min(minX, rect.x);
                minY = Math.min(minY, rect.y);
                maxX = Math.max(maxX, rect.x + rect.width);
                maxY = Math.max(maxY, rect.y + rect.height);
            }
            textRectangle = new Rectangle(minX, minY, maxX - minX, maxY - minY);
            break;
        } else if (currentPhrase.length() > targetPhrase.length()) {
            break;
        }
        startIndex++;
    }
    if (textRectangle != null) {
        break;
    }
}

内容的提问来源于stack exchange,提问作者Asmoun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:20:04