xiaji 8600c0f576 feat: 初始提交 - 滚动截屏OCR工具
- 实现智能区域检测算法(灰度阈值 + 连续行判定)
- 支持Umi-OCR和自定义HTTP OCR服务
- 添加热键触发和鼠标框选区域功能
- 实现自动滚动和智能停止逻辑
- 添加完整的README文档
2026-03-06 15:07:51 +08:00

滚动截屏OCR工具

一个智能的滚动截屏OCR工具可以自动识别页面中的内容区块div滚动截屏并进行OCR文字识别。

功能特点

  • 🎯 智能区域检测:使用灰度阈值 + 连续行判定算法自动识别内容区块div和空白间隔
  • 📜 自动滚动截屏:根据内容高度自动计算滚动距离,连续截屏
  • 🔤 OCR文字识别:支持 Umi-OCR 和自定义HTTP OCR服务
  • ⌨️ 热键触发:按 Ctrl+F9 快速启动
  • 🖱️ 框选区域:拖动鼠标选择截图区域
  • 🛑 智能停止:检测到重复内容时自动停止

适用场景

  • 长网页滚动截图OCR
  • 聊天记录导出
  • 长文档内容提取
  • 任何需要滚动才能看完全部的内容

安装

1. 克隆仓库

git clone <远程仓库地址>
cd long-screen-cut

2. 安装依赖

pip install -r requirements.txt

依赖列表:

  • opencv-python >= 4.8.0
  • numpy >= 1.24.0
  • pillow >= 10.0.0
  • pyautogui >= 0.9.54
  • keyboard >= 0.13.5
  • mouse >= 0.7.1
  • requests >= 2.31.0
  • loguru >= 0.7.0

3. 安装OCR引擎二选一

方案AUmi-OCR推荐

  1. 下载 Umi-OCR
  2. 解压并运行 Umi-OCR.exe
  3. 进入 设置 → HTTP接口
  4. 勾选 启用HTTP服务
  5. 确保端口为 1224(默认)

方案B自定义HTTP OCR服务

参考 ocr_server_example.py 实现自己的OCR服务或修改配置使用其他OCR API。

使用方法

启动程序

python main.py

操作流程

  1. 等待热键:程序启动后会显示 等待热键 Ctrl+F9 启动...
  2. 触发截屏:按 Ctrl+F9
  3. 检查服务程序会检查OCR服务是否运行
  4. 框选区域:按住鼠标左键拖动,选择要截图的区域
  5. 自动处理:程序会自动:
    • 截取当前屏幕
    • 分析内容区块div
    • OCR识别文字
    • 计算滚动距离
    • 滚动到下一屏
    • 重复上述过程
  6. 自动停止:当检测到重复内容时自动停止

输出结果

  • 截图保存在 output/ 目录
  • OCR结果保存在 output/all_results_时间戳.json

配置说明

编辑 main.py 中的 Config 类:

class Config:
    # 热键设置
    HOTKEY = "ctrl+f9"

    # 图像分析参数
    GRAY_THRESHOLD = 240          # 灰度阈值0-255
    CONSECUTIVE_LINES = 3         # 连续多少行判定为空白
    WHITE_PIXEL_RATIO = 0.9       # 白色像素比例阈值

    # OCR设置
    OCR_ENGINE = "umi"            # "umi" 或 "http"
    OCR_API_URL = "http://localhost:8000/ocr"  # HTTP模式时使用
    OCR_TIMEOUT = 30              # OCR请求超时时间

    # Umi-OCR设置
    UMI_OCR_HOST = "127.0.0.1"
    UMI_OCR_PORT = 1224

    # 滚动设置
    SCROLL_DELAY = 0.5            # 滚动后等待渲染时间(秒)
    MAX_SCROLL_COUNT = 100        # 最大滚动次数

    # 输出设置
    OUTPUT_DIR = "output"

核心算法

内容区块检测算法

  1. 灰度转换:将截图转换为灰度图
  2. 逐行扫描:计算每行的白色像素比例
  3. 空白判定:如果一行中超过 WHITE_PIXEL_RATIO默认90%)的像素灰度值 > GRAY_THRESHOLD默认240则认为是空白行
  4. 连续判定:连续 CONSECUTIVE_LINES默认3行空白行视为间隔区域
  5. 区块划分非空白行区域视为内容区块div

滚动距离计算

滚动距离 = 第一个div高度 + 其后空白间隔高度 - 重叠区域

重叠区域确保连续性默认为div高度的1/4。

项目结构

long-screen-cut/
├── main.py                 # 主程序
├── umi_ocr_client.py       # Umi-OCR HTTP客户端
├── ocr_server_example.py   # OCR服务示例Flask
├── requirements.txt        # Python依赖
├── .gitignore             # Git忽略配置
└── README.md              # 本文件

API文档

UmiOCRClient

from umi_ocr_client import UmiOCRClient

client = UmiOCRClient(host="127.0.0.1", port=1224)

# 检查服务状态
if client.is_service_running():
    print("服务运行中")

# 截图识别
text = client.recognize_screenshot()

# 图片文件识别
text = client.recognize_image("/path/to/image.png")

# 批量识别
texts = client.recognize_images(["1.png", "2.png", "3.png"])

常见问题

Q: 程序提示"Umi-OCR服务未运行"

A: 请确保:

  1. Umi-OCR软件已启动
  2. 进入 设置 → HTTP接口
  3. 勾选 启用HTTP服务
  4. 端口设置为 1224

Q: 识别区域不准确

A: 调整 Config 中的图像分析参数:

  • GRAY_THRESHOLD:降低可以识别更浅的背景色
  • CONSECUTIVE_LINES:增加可以减少误判
  • WHITE_PIXEL_RATIO:降低可以容忍更多杂色

Q: 滚动太快/太慢

A: 调整 SCROLL_DELAY

  • 网页加载慢:增加延迟
  • 本地应用:可以减少延迟

Q: 如何停止程序

A:

  • 正常停止:按 Ctrl+C
  • 强制停止:关闭终端窗口

开发计划

  • 支持更多OCR引擎PaddleOCR、Tesseract等
  • GUI界面
  • 支持水平滚动
  • 智能去重(相似度判断)
  • 导出为多种格式Markdown、Word、PDF

许可证

MIT License

致谢

  • Umi-OCR - 优秀的离线OCR软件
Description
长截屏,ocr,解决痛点
Readme 54 KiB
Languages
Python 100%