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
相关产品推荐
相关产品推荐

