开源一个安卓项目,基于视频流的实时 ocr 识别。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Gdao3386
V2EX    分享创造

开源一个安卓项目,基于视频流的实时 ocr 识别。

  •  1
     
  •   Gdao3386 3 月 25 日 716 次点击

    TextFinder - 实时文字查找神器

    对准摄像头,输入关键词,瞬间定位目标文字

    Android API Kotlin License


    项目简介

    TextFinder 是一款基于 Android 的实时文字识别与定位应用。只需将摄像头对准任何包含文字的场景,输入你想查找的关键词,应用会实时高亮显示所有匹配的文字区域。

    设计初衷

    这个项目诞生于一个实际需求:帮助集运仓库工作人员快速找到快递包裹

    在繁忙的集运仓库中,工作人员经常需要在一堆包裹中找到特定客户的快递。传统方式是逐个翻看面单上的收件人信息,效率低下且容易遗漏。TextFinder 的出现彻底改变了这一工作流程:

    对准包裹堆 → 输入客户姓名/单号 → 瞬间定位目标包裹


    功能特性

    特性 描述
    实时高亮 匹配的文字区域以红色边框实时标注,一目了然
    中英文支持 基于 Google ML Kit 中文识别引擎,完美支持中文、英文及混合文本
    极速响应 采用帧级处理优化,搜索结果即时呈现
    简洁界面 极简设计,打开即用,零学习成本
    本地处理 所有文字识别在设备端完成,无需联网,保护隐私

    使用场景

    • 物流仓储:快速定位特定客户的包裹
    • 图书馆/书店:在书架上快速找到目标书籍
    • 文档整理:在成堆文件中定位特定内容
    • 零售场景:在货架上快速找到特定商品
    • 学习场景:在教材/资料中快速定位知识点

    技术架构

    核心技术栈

    ┌─────────────────────────────────────────────────────────────┐ │ TextFinder 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ CameraX │───│ ML Kit │───│ OverlayView │ │ │ │ (预览流) │ │ (OCR 识别) │ │ (结果渲染) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ PreviewView │ │ TextRecognizer│ │ Canvas 绘制 │ │ │ │ (显示画面) │ │ (中文模型) │ │ (红色边框) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ 

    技术选型

    组件 技术方案 选择理由
    相机框架 CameraX Jetpack 官方相机库,生命周期感知,兼容性强
    OCR 引擎 ML Kit Text Recognition (Chinese) Google 端侧 OCR ,中文识别精准,离线可用
    UI 框架 Kotlin + ViewBinding 原生性能,类型安全,开发效率高
    异步处理 ExecutorService + Callback 避免阻塞主线程,保证 UI 流畅

    实现原理

    1. 实时文字识别流程

    摄像头帧 → 图像预处理 → ML Kit OCR → 文字块解析 → 关键词匹配 → 坐标映射 → 界面渲染 │ │ │ │ │ │ │ ImageProxy 旋转校正 TextRecognizer TextBlock contains() 坐标变换 drawRect() 

    2. 关键技术点

    帧级处理优化

    // 使用 AtomicBoolean 避免重复处理,跳过积压帧 private val isProcessing = AtomicBoolean(false) if (!isProcessing.compareAndSet(false, true)) { imageProxy.close() // 跳过,正在处理中 return } 

    坐标映射算法

    PreviewView 使用 fillCenter (CENTER_CROP) 模式,需要精确映射 OCR 坐标到视图坐标:

    // 复刻 CENTER_CROP 变换逻辑 val scale = maxOf(viewWidth / imageWidth, viewHeight / imageHeight) val offsetX = (viewWidth - imageWidth * scale) / 2f val offsetY = (viewHeight - imageHeight * scale) / 2f // 映射坐标 mappedRect.set( box.left * scale + offsetX, box.top * scale + offsetY, box.right * scale + offsetX, box.bottom * scale + offsetY ) 

    多级匹配策略

    应用在 Block → Line → Element 三个层级进行匹配,确保无论目标文字是整段、一行还是单个词,都能被准确捕获。


    快速开始

    环境要求

    • Android Studio Hedgehog 或更高版本
    • Android SDK 34
    • Kotlin 1.9+
    • 最低支持 Android 8.0 (API 26)

    构建步骤

    # 克隆项目 git clone https://github.com/xiaolan66/TextFinder.git # 打开 Android Studio ,导入项目 # 等待 Gradle 同步完成 # 连接 Android 设备或启动模拟器 # 点击 Run 按钮即可 

    权限说明

    应用仅需 摄像头权限,首次启动时会自动请求。所有数据处理均在本地完成,不收集任何用户信息。


    项目结构

    app/src/main/java/com/example/textfinder/ ├── MainActivity.kt # 主界面逻辑:相机启动、OCR 调用、搜索匹配 └── OverlayView.kt # 自定义视图:坐标映射、边框绘制 app/src/main/res/layout/ └── activity_main.xml # 界面布局:搜索栏、相机预览、叠加层 

    界面预览

    ┌─────────────────────────────────┐ │ 输入要查找的文字... [×] │ ← 搜索栏 ├─────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ 客户: 张三 │ │ ← 匹配项 │ │ ┌───────┐ │ │ 红色边框高亮 │ │ │李四 │ │ │ │ │ └───────┘ │ │ │ │ 客户: 张三 │ │ │ └─────────────┘ │ │ │ │ 找到 2 处匹配 │ ← 状态提示 └─────────────────────────────────┘ 

    扩展方向

    • 支持连续多关键词搜索
    • 添加历史搜索记录
    • 支持语音输入关键词
    • 增加夜间模式
    • 支持导出识别结果

    开源协议

    本项目采用 MIT License 开源协议。


    商业合作

    如果你对 TextFinder 感兴趣,欢迎在商业层面进行探索与合作:

    微信:URlake

    可能的合作方向:

    • 企业定制开发
    • 功能深度定制
    • 技术咨询与培训
    • SDK 授权集成

    如果这个项目对你有帮助,请给一个 Star 支持!

    Made with by xiaolan66

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1583 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 16:43 PVG 00:43 LAX 09:43 JFK 12:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86