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

冬晨酱_6158

冬晨酱_6158

2026-01-16

321人浏览

原创

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

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

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

Feihong Word Docx
Feihong Word Docx

创建、检查和编辑 Microsoft Word 文档和 DOCX 文件,支持样式、编号、修订追踪、表格、分节及兼容性检查

下载

✅ 正确实现思路

  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<textblock> detections) {
    final SparseArray<textblock> items = detections.getDetectedItems();
    if (items.size() == 0) return;

    // Step 1: 拼接全部识别文本
    StringBuilder fullText = new StringBuilder();
    for (int i = 0; i  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("
");
            matchedWords.append(keyword);
        }
    }

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

⚠️ 关键注意事项

  • 不要在 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应用即可稳定、高效地实现关键词过滤显示,兼顾准确性与响应性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.06.20

3696

8

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

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

2023.07.05

2181

4

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

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

2023.07.05

5882

9

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

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

2023.08.11

772

5

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

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

2023.08.31

500

5

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

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

2023.11.13

653

12

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

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

2023.11.17

366

3

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

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

2023.12.06

679

7

php正则表达式有哪些
php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、&a

2024.02.23

292

5

热门下载

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

精品课程

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

共162课时 | 42.9万人学习

Java 教程
Java 教程

共578课时 | 185.7万人学习

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

共64课时 | 9.3万人学习