- 实现智能区域检测算法(灰度阈值 + 连续行判定) - 支持Umi-OCR和自定义HTTP OCR服务 - 添加热键触发和鼠标框选区域功能 - 实现自动滚动和智能停止逻辑 - 添加完整的README文档
5.3 KiB
5.3 KiB
滚动截屏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引擎(二选一)
方案A:Umi-OCR(推荐)
- 下载 Umi-OCR
- 解压并运行
Umi-OCR.exe - 进入 设置 → HTTP接口
- 勾选 启用HTTP服务
- 确保端口为
1224(默认)
方案B:自定义HTTP OCR服务
参考 ocr_server_example.py 实现自己的OCR服务,或修改配置使用其他OCR API。
使用方法
启动程序
python main.py
操作流程
- 等待热键:程序启动后会显示
等待热键 Ctrl+F9 启动... - 触发截屏:按
Ctrl+F9 - 检查服务:程序会检查OCR服务是否运行
- 框选区域:按住鼠标左键拖动,选择要截图的区域
- 自动处理:程序会自动:
- 截取当前屏幕
- 分析内容区块(div)
- OCR识别文字
- 计算滚动距离
- 滚动到下一屏
- 重复上述过程
- 自动停止:当检测到重复内容时自动停止
输出结果
- 截图保存在
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"
核心算法
内容区块检测算法
- 灰度转换:将截图转换为灰度图
- 逐行扫描:计算每行的白色像素比例
- 空白判定:如果一行中超过
WHITE_PIXEL_RATIO(默认90%)的像素灰度值 >GRAY_THRESHOLD(默认240),则认为是空白行 - 连续判定:连续
CONSECUTIVE_LINES(默认3行)空白行视为间隔区域 - 区块划分:非空白行区域视为内容区块(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: 请确保:
- Umi-OCR软件已启动
- 进入 设置 → HTTP接口
- 勾选 启用HTTP服务
- 端口设置为
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软件