# ocr_app **Repository Path**: vividlipi/ocr_app ## Basic Information - **Project Name**: ocr_app - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-05 - **Last Updated**: 2026-07-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 互动消息 OCR 抓取工具 监控一个会滚动的互动消息区域(如直播间评论,无 API 可用时),用 OCR 把观众消息抓成文本: 屏幕/窗口区域截图 → 变化检测 → 后台 OCR → 合并去重 → SQLite 落库。 ## 特性 - **屏幕区域捕获**(mss,按 DPI 自动换算)。 - **后台线程 OCR**:识别在 QThread 跑,UI 不卡顿。 - **滚动/变化检测**:帧差 + 去抖,聊天滚动时自动触发。 - **去重落库**:有界近期窗口去重 + SQLite 持久化 + 界面表格。 - **选区框**:抓取条拖动、8 向缩放、方向键微调、精确坐标输入、强制置顶。 - **可测试**:核心逻辑无 Qt 依赖,pytest 覆盖单测与端到端。 ## 安装 ```bash conda activate rapidocr # 已含 rapidocr / onnxruntime / numpy / opencv pip install -e ".[dev]" # 安装本项目 + PySide6/mss/pywin32/windows-capture/pytest ``` ## 运行 ```bash python -m ocr_app # 或可执行入口 ocr-app ``` ## 捕获 拖绿色选区框到聊天区域(区域须在屏幕上可见)即可。 ## 选区框操作 - 顶部抓取条拖动定位;边/角 8 向缩放;方向键微调(Shift = 10px);右键「精确坐标」输入数值。 - 鼠标悬停在边线/角会显示双箭头光标(缩放),在抓取条/框内显示移动光标(整体拖动)。 - 监控中选区框点击穿透(不挡聊天),并周期重断置顶(`HWND_TOPMOST`)避免被其它置顶窗口盖住。 ## 去重 / 落库 - 有界近期窗口去重(默认 200):连续帧同一行不重复;滚走后再次出现会重新入库。 - 可配置:最低置信度、最短行长、去重窗口大小。 - 消息落库 SQLite,并在界面表格展示(时间 / 文本 / 置信度 / 来源)。 ## 数据位置 `%LOCALAPPDATA%\ocr_app\` 下:`settings.json`(设置)、`messages.db`(消息库)。 ## 测试 ```bash pytest # 单测 + 端到端(core 无 Qt;e2e 用 QApplication) ``` ## 架构 ``` src/ocr_app/ app.py / __main__.py 入口与 QApplication 引导 config.py AppSettings(持久化 JSON) core/ 纯 Python、无 Qt、可单测 models.py ocr_engine.py change_detect.py result_merger.py storage.py capture/ base.py screen_capturer.py window_capturer.py(WGC) window_list.py window_geom.py workers/monitor.py MonitorWorker(QThread):截图→检测→OCR→合并→发新消息 platform/win32_topmost.py Win32 置顶 ui/ region_overlay.py main_window.py tests/ unit/ e2e/ fixtures/测试.png ``` ## 排错 - **选区框被别的窗口盖住**:监控中每 ~1.5s 用 Win32 重断置顶;若仍被盖,确认没有更强的置顶工具抢焦。 - **控制台打印中文/emoji 报 `UnicodeEncodeError`**:Windows 控制台是 GBK,脚本向 stdout 打印需用 ASCII 或 `sys.stdout.reconfigure(encoding="utf-8")`;GUI 内显示不受影响。 - **选区位置偏移**:多显示器/不同 DPI 下若偏移,程序已按 `devicePixelRatio` 自动换算,确认系统缩放设置一致。 ## 已知限制 / 后续 - 去重按文本(全角归一化);同一文本由不同人发送只入库一次。 - 未做:打包 exe、系统托盘、跨帧行跟踪去重。