惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
MyScale Blog
MyScale Blog
H
Help Net Security
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
M
MIT News - Artificial intelligence
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Proofpoint News Feed
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
开源一个安卓项目,基于视频流的实时 ocr 识别。
Gdao3386 · 2026-03-25 · via V2EX

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