0

0

如何在OCR实时识别中过滤并显示匹配关键词的文本

霞舞

霞舞

发布时间:2026-01-16 11:13:02

|

301人浏览过

|

来源于php中文网

原创

如何在OCR实时识别中过滤并显示匹配关键词的文本

本文介绍如何在android ocr应用中,从识别出的文本中精准筛选出预定义关键词列表中的匹配项,并仅将这些匹配内容显示在textview中,避免无效循环和变量作用域错误。

在OCR实时识别场景中(如使用ML Kit或Firebase ML Vision),receiveDetections() 回调会持续返回检测到的文本块(TextBlock)。原始代码将所有识别文本拼接后直接显示,但实际业务常需白名单式过滤——即只展示用户关心的关键词(如“abc”“start”“exit”等)。你遇到的问题核心在于:误用局部变量 stringBuilder、混淆 contains() 的语义、滥用死循环 while,且未正确实现“提取匹配词”逻辑

✅ 正确实现思路

  1. 先完整提取OCR识别结果(即 stringBuilder.toString() 得到全文本);
  2. 遍历关键词列表,检查每个词是否出现在该文本中(注意:是 text.contains(keyword),而非 list.contains(stringBuilder) —— 后者永远为 false,因为 stringBuilder 是对象,不是字符串);
  3. 收集所有匹配的关键词(去重可选),拼接后设入 textView
  4. 移除所有 while 循环——它既无必要又易导致ANR(主线程卡死),因 textView.getText() 在首次调用时必为空,循环永不退出。

✅ 修正后的完整代码示例

@Override
public void receiveDetections(Detector.Detections detections) {
    final SparseArray items = detections.getDetectedItems();
    if (items.size() == 0) return;

    // Step 1: 拼接全部识别文本
    StringBuilder fullText = new StringBuilder();
    for (int i = 0; i < items.size(); i++) {
        TextBlock item = items.valueAt(i);
        fullText.append(item.getValue()).append(" "); // 用空格分隔,便于单词匹配
    }
    String detectedText = fullText.toString().trim();

    // Step 2: 定义关键词白名单(建议声明为成员变量,避免重复创建)
    List keywords = Arrays.asList("abc", "start", "confirm", "cancel");

    // Step 3: 收集所有在 detectedText 中出现的关键词(区分大小写,如需忽略则用 containsIgnoreCase)
    StringBuilder matchedWords = new StringBuilder();
    for (String keyword : keywords) {
        if (detectedText.contains(keyword)) {
            if (matchedWords.length() > 0) matchedWords.append("\n");
            matchedWords.append(keyword);
        }
    }

    // Step 4: 更新UI(务必在主线程,此处已在 post 中)
    textView.post(() -> {
        if (matchedWords.length() == 0) {
            textView.setText("未匹配关键词"); // 可选:显示提示
        } else {
            textView.setText(matchedWords.toString());
        }
    });
}

⚠️ 关键注意事项

  • 不要在 receiveDetections 中使用 while 或 for 长循环:该方法本身已是回调,高频触发(如30fps),循环会严重阻塞UI线程;
  • stringBuilder 是局部变量,作用域仅限当前 Runnable 内,外部无法访问,更不能用于 list.contains(...) 判断;
  • list.contains(str) 检查的是列表中是否存在**完全相等的字符串元素,而你需要的是“文本中是否包含该词” → 应用 str.contains(keyword);
  • 若需精确单词匹配(避免子串误匹配),可改用正则表达式
    Pattern.compile("\\b" + Pattern.quote(keyword) + "\\b", Pattern.CASE_INSENSITIVE)
           .matcher(detectedText).find()
  • 性能优化建议:将 keywords 声明为 static final List 或 Set(如 HashSet),提升 contains 查询效率(O(1))。

通过以上重构,你的OCR应用即可稳定、高效地实现关键词过滤显示,兼顾准确性与响应性。

快剪辑
快剪辑

国内⼀体化视频⽣产平台

下载

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

248

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 11.9万人学习

Java 教程
Java 教程

共578课时 | 46.4万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号