用 OpenCV + PaddleOCR 从短视频中提取滚动小说文字,支持纯色底和复杂背景两种模式
短视频平台上活跃着大量"滚动小说"类型的内容——画面是纯色或图片背景,文字从下往上缓慢滚动,观众像读电子书一样"读"视频。这类视频的观看体验很好,但如果你想把这些文字保存下来(做笔记、翻译、或者重新整理),就需要从视频中提取文字。
本教程介绍的方案专门针对这种滚屏文字场景,使用 OpenCV 做背景建模、PaddleOCR 做中文字识别,配合跨帧去重和 LLM 通顺性修正,最终输出干净完整的文本。
这也是 OCR 视频提取,但它处理的场景和之前介绍的视频字幕提取不同:
| 普通字幕提取 | 滚屏文字提取 | |
|---|---|---|
| 文字位置 | 固定在画面底部或中间 | 从下往上持续滚动 |
| 背景 | 通常是半透明黑底 | 纯色底或复杂图片 |
| 帧间变化 | 字幕切换时才变 | 每帧都在移动 |
| 核心挑战 | 检测字幕区域 | 去重 + 排序(滚屏文字在帧间可能交错) |
整个提取流程分为 4 步:
需要 Python 3.9+、ffmpeg、以及几个 Python 包。
brew install ffmpeg
pip install opencv-python numpy paddleocr paddlepaddle
# 验证
python3 -c "import cv2, paddle; from paddleocr import PaddleOCR; print('OK')"
推荐 Miniconda 独立环境,版本需锁定(PaddlePaddle 3.x 在 Windows 上有兼容问题)。
# 创建 conda 环境
conda create -n ocr python=3.10 -y
conda activate ocr
# 关键:版本必须锁定
pip install "paddlepaddle==2.6.2" "paddleocr==2.9.1" opencv-python "numpy<2"
# 安装 ffmpeg(通过 winget)
winget install Gyan.FFmpeg
winget install Microsoft.VCRedist.2015+.x64
sudo apt install ffmpeg
pip install opencv-python numpy paddleocr paddlepaddle
抽帧间隔是影响提取质量的最关键参数。原则是:观察视频中一屏文字从出现到完全滚出大约需要几秒。
| 文字停留时长 | 选择间隔 | 命令参数 | 说明 |
|---|---|---|---|
| 8 秒以上 | 5 秒(默认) | --fps 0.2 | 适合大多数视频,处理最快 |
| 5-8 秒 | 3 秒 | --fps 0.333 | 滚动稍快时使用 |
| 不确定 | 先用 5 秒 | --fps 0.2 | 发现漏字再改短 |
| 漏字明显 | 1 秒 | --fps 1 | 间隔越小越完整,但耗时更长 |
--fps = 1 / 间隔秒数。例如你想每 3 秒抽一帧 → `--fps 0.333`。| 模式 | 适用场景 | 速度 | 原理 |
|---|---|---|---|
--mode raw | 白底、米色底、橙红底等纯色背景 | 快 | 直接用原图 OCR |
--mode diff | 照片、水印、渐变背景等复杂画面 | 慢 | 背景减除后 OCR |
python3 scripts/extract.py video.mp4 -o output.txt -y --mode raw
python3 scripts/extract.py video.mp4 -o output.txt -y --mode diff
# 每 1 秒 1 帧(滚动较快或漏字时)
python3 scripts/extract.py video.mp4 -y --mode raw --fps 1
# 每 10 秒 1 帧(滚动较慢,节省时间)
python3 scripts/extract.py video.mp4 -y --mode raw --fps 0.1
参数说明:
-o output.txt — 输出文件路径-y — 跳过交互确认(所有参数已在命令行指定时使用)--mode raw/diff — 背景处理模式--fps N — 抽帧率--crop-top N — 手动裁剪顶部 N 行(排除标题栏,可选)--crop-bottom N — 手动裁剪底部 N 行(排除进度条,可选)脚本输出原始文本后,还需要以下步骤让文本更干净:
, → ,、" → " "),注意数字和英文单词中的保留原样--crop-top/--crop-bottom。纯色底(白色、米色、单色)直接用 --mode raw,速度快且效果一样好。diff 模式是为了处理复杂背景的,用在纯色底上没必要。
关键看文字的滚动速度。播放视频,看一屏文字从出现到完全滚出需要几秒。通常 5 秒/帧是一个好的起点,处理完发现漏字再缩短间隔。
可能是抽帧时机刚好卡在文字滚动到一半的时候。缩短抽帧间隔(如从 5 秒改为 3 秒)通常能解决。如果持续出现,检查 --edge-margin 参数。
📌 本教程介绍的方法完全在本地运行,视频文件不会上传到任何服务器。适合处理包含敏感内容的视频。如需提取普通字幕(非滚动),可参考 视频字幕提取教程。