Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

复杂场景下的手机拍摄文档自动扫描与透视矫正系统

本项目使用 OpenCV 图像处理实现透视矫正和扫描增强,并可选使用 Teklia Doc-UFCN 文档分割模型提升复杂场景主体检测。默认运行在 CPU 上,不需要 GPU。

环境

cd document-scanner
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

如果系统命令是 python3,将上面的 python 替换为 python3

数据集

默认使用 SmartDoc 2015 Challenge 1 Dataset 的样例数据集进行开发验证。

下载小样例数据:

cd document-scanner
source .venv/bin/activate
python scripts/download_smartdoc.py --variant sample --extract

下载完整帧数据:

python scripts/download_smartdoc.py --variant full --extract

完整帧数据压缩包约 972 MiB,解压后会更大。低配置机器建议先使用 sample,批处理时配合 --limit--sample-step 抽样。

SmartDoc 小样例包内主要是 .avi 视频。可先抽帧再做图片扫描:

python scripts/extract_video_frames.py data/raw/sample --output-dir data/samples/smartdoc_frames --every 30 --max-frames-per-video 8
python -m src.document_scanner batch data/samples/smartdoc_frames --output-dir outputs/smartdoc_sample --limit 24

单图处理

干净仓库不包含图片数据。没有下载数据集时,先生成一张本地测试图:

cd document-scanner
source .venv/bin/activate
python scripts/create_demo_image.py
cd document-scanner
source .venv/bin/activate
python -m src.document_scanner single data/samples/demo_document.jpg --output-dir outputs/single

也可以使用脚本入口:

python scripts/process_image.py data/samples/demo_document.jpg --output-dir outputs/single

输出文件包括:

  • *_00_original.jpg:原图
  • *_01_edges.jpg:边缘图
  • *_02_detected.jpg:边界检测可视化
  • *_03_warped.jpg:透视矫正结果
  • *_04_scanned.jpg:扫描增强结果
  • *_metadata.json:检测状态、四角点和参数

批量处理

cd document-scanner
source .venv/bin/activate
python -m src.document_scanner batch data/raw/sample --output-dir outputs/batch --limit 50

脚本入口:

python scripts/batch_process.py data/raw/sample --output-dir outputs/batch --limit 50

批处理会递归查找图片文件,并生成 batch_summary.json

Web 演示

cd document-scanner
source .venv/bin/activate
uvicorn src.web_app:app --host 0.0.0.0 --port 8000

浏览器访问:

http://localhost:8000

Web 页面支持上传 JPG/PNG/WebP/BMP 图片,调节 Canny 阈值和检测宽度,显示原图、边界检测、透视矫正、扫描增强四个结果。

默认检测器为 OpenCV。传统高对比文档照片通常由 OpenCV 轮廓检测更稳定处理;需要尝试复杂多平面照片时,可在 Web 页面或 CLI 中选择 自适应候选评分仅 Doc-UFCN

Doc-UFCN 以常驻 worker 子进程运行。首次请求会启动 Python 3.10 worker 并加载模型,后续请求复用同一模型进程,避免每张图重复加载权重。

Doc-UFCN 的输出只作为候选生成和粗定位。程序会保留多个 Doc-UFCN 候选,对每个候选执行二阶段边缘精修,并对候选四边执行保守的边缘吸附与角点精修,再用边缘支撑、面积比例、边界接触、透视形状和聚焦点距离等通用规则选择最终主体。

在多平面照片中,可以先在原图上点击一个聚焦点,再处理图片。后端会围绕该点生成 focus_seed_candidate 强约束候选,并与 OpenCV、Doc-UFCN 候选一起评分;结果 metadata 会记录 focus_pointcandidate_countselection_reason 和最终 detector

Web 页面有两种图片来源:

  • 服务器图片:从 data/server_images 递归读取图片并下拉选择。
  • 本地上传:从浏览器上传图片到后端,由服务器端 OpenCV 处理。

仓库默认不包含服务器端演示图片。需要使用 服务器图片 下拉选择时,创建 data/server_images 并放入 JPG/PNG/WebP/BMP 图片,然后刷新网页即可;不放图片也不影响本地上传功能。

Doc-UFCN 文档主体检测

Doc-UFCN 需要 Python 3.10 隔离环境。系统已有 python3.10 时执行:

cd document-scanner
bash scripts/setup_docufcn_env.sh

如果系统没有 python3.10,可先在主虚拟环境中安装 uv,再运行同一脚本:

source .venv/bin/activate
pip install uv
bash scripts/setup_docufcn_env.sh

安装完成后,可以显式选择 Doc-UFCN 候选评分路径:

python scripts/create_demo_image.py
python -m src.document_scanner single data/samples/demo_document.jpg --detector docufcn --output-dir outputs/docufcn_single

命令行也支持传入原图坐标系中的聚焦点:

python -m src.document_scanner single data/samples/demo_document.jpg --detector docufcn --focus-x 600 --focus-y 450 --output-dir outputs/docufcn_focus

如果只想使用传统 OpenCV:

python -m src.document_scanner single data/samples/demo_document.jpg --detector opencv --output-dir outputs/single

验证自有上传图片:

python scripts/evaluate_uploaded_images.py --input-dir data/samples --detector opencv

该脚本会递归读取输入目录中的常见图片文件,默认使用 OpenCV,基础依赖安装后即可运行。最小仓库不包含评估图片,可先运行 python scripts/create_demo_image.py 生成 data/samples/demo_document.jpg,或把自有图片放入 data/server_images 后通过 --input-dir 指定目录。结果默认写入 outputs/image_eval/,包含每张图的边界检测、透视矫正、扫描增强、contact sheet 和 summary.json。可用 --detector auto|docufcn|opencv--output-dir 指定目录;使用 --detector auto--detector docufcn 前需先完成 Doc-UFCN 环境安装。命令行可用 --focus-points-json 传入图片文件名到 [x, y] 的聚焦点映射。

注意:该批处理脚本在 --detector auto--detector docufcn 模式下会启动自己的 Doc-UFCN worker。低内存环境下不要与 Web 服务的 Doc-UFCN 请求同时运行。

Docker 独立部署

请在仓库根目录执行 compose 命令:

cd document-scanner
mkdir -p data/server_images outputs
docker compose up --build -d

访问:

http://服务器IP:8000

查看日志:

docker compose logs -f web

停止服务:

docker compose down

说明:

  • Compose 项目名固定为 document-scanner
  • 服务容器名为 document-scanner-web
  • 端口映射为 8000:8000
  • 镜像构建时会安装 uv、创建 /app/.venv-docufcn、下载 Doc-UFCN generic-page 权重,并通过常驻 worker 进行文档主体检测。构建过程不会执行 uv cache clean,避免删除 venv 解释器指向的 uv-managed Python runtime。
  • ./data/server_images 以只读方式挂载到容器。该目录可为空;新增服务器端演示图片后刷新网页即可。
  • ./outputs 挂载到容器用于保留后续输出。
  • .dockerignore 会排除 .venvoutputsdata/rawdata/samplesdata/server_images 等大目录,避免把虚拟环境、运行输出和数据文件打进镜像。

本地测试图

没有下载数据集时,可以先生成一张测试图验证流程:

cd document-scanner
source .venv/bin/activate
python scripts/create_demo_image.py
python -m src.document_scanner single data/samples/demo_document.jpg --output-dir outputs/single

算法流程

输入图片
→ 等比例缩放
→ 灰度化与 CLAHE 光照增强
→ 高斯滤波
→ Canny 边缘检测
→ 形态学闭运算和膨胀
→ 轮廓查找
→ 多边形拟合与四边形筛选
→ 四角点排序
→ 透视变换
→ 阴影削弱、自适应阈值扫描增强
→ 输出结果

项目结构

document-scanner/
├── src/
│   ├── document_scanner.py
│   ├── docufcn_detector.py
│   └── web_app.py
├── scripts/
│   ├── batch_process.py
│   ├── create_demo_image.py
│   ├── download_smartdoc.py
│   ├── extract_video_frames.py
│   ├── docufcn_worker.py
│   ├── setup_docufcn_env.sh
│   └── process_image.py
├── web_static/
│   └── index.html
├── data/          # 运行时数据、样例图和服务器图片,按需生成或放入
├── outputs/       # 运行输出,按需生成
├── requirements.txt
└── README.md

About

基于OpenCV的文档扫描、透视矫正与扫描增强系统,支持可选Doc-UFCN检测。。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages