# ScanOCR **Repository Path**: kellyworld0/scan-ocr ## Basic Information - **Project Name**: ScanOCR - **Description**: 这是一个文档扫描与OCR识别系统,能将拍摄倾斜的纸质文档自动矫正为正面视图,并提取其中的文字内容。项目通过边缘检测找到文档边界,利用透视变换拉直图像,最后用OCR引擎识别文字,实现从"拍照"到"可编辑文本"的一键转换。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-22 - **Last Updated**: 2026-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DocumentScannerOCR 基于 OpenCV 和 Tesseract OCR 的文档扫描与文字识别系统,实现文档图像的自动矫正、透视变换和文字提取。 ## 功能特点 - 自动边缘检测与轮廓提取(Canny 边缘检测 + 轮廓近似) - 透视变换矫正文档视角,生成扫描效果图 - 支持图像预处理(二值化 / 中值模糊) - 集成 Tesseract OCR 进行文字识别 ## 项目结构 ├── scan.py # 文档扫描核心程序 ├── ocr.py # OCR 文字识别程序 ├── scan.jpg # 扫描结果输出图片 └── README.md # 项目说明文档 ## 软件架构 ### 第一阶段:文档检测与透视变换(scan.py) - **预处理模块**:灰度转换、高斯模糊 - **边缘检测模块**:Canny 算法提取图像边缘 - **轮廓检测模块**:查找并筛选轮廓(按面积排序取前5) - **多边形近似模块**:Douglas-Peucker 算法寻找四边形轮廓 - **透视变换模块**:基于四点进行透视变换矫正文档 ### 第二阶段:文字识别(ocr.py) - **图像预处理**:OTSU 二值化 或 中值模糊 - **OCR 引擎**:Tesseract OCR 提取文字内容 ### 整体流程 原始图像 → 灰度转换 → 高斯模糊 → Canny边缘检测 → 轮廓筛选 → 多边形近似 → 透视变换 → 扫描图 → 图像预处理 → OCR识别 → 输出文字 ## 使用说明 ### 文档扫描 ```bash python scan.py -i <图片路径> ``` 示例: python scan.py -i document.jpg 程序会依次显示边缘检测结果、检测到的文档轮廓、原始图像与扫描结果对比,并保存扫描图为 `scan.jpg`。 ### OCR 文字识别 ``` python ocr.py ``` 程序读取 `scan.jpg` 进行识别并输出文字内容。可在 `ocr.py` 中修改 `preprocess` 变量切换预处理方式: - `preprocess = 'thresh'`:OTSU 二值化(推荐文字清晰的文档) - `preprocess = 'blur'`:中值模糊(推荐有噪点的文档) ## 核心函数说明 | 函数 | 功能 | 说明 | | :--------------------------------- | :------- | :--------------------------------------- | | `order_points(pts)` | 点排序 | 将四个点按左上、右上、右下、左下顺序排列 | | `four_point_transform(image, pts)` | 透视变换 | 根据四个点对图像进行透视变换矫正 | | `resize(image, width, height)` | 图像缩放 | 保持宽高比进行缩放 | ## 注意事项(两个脚本通用) ### 图像要求 - 文档应为四边形形状,边缘清晰可见 - 文档背景与前景应有较好的对比度 - 光照均匀,避免过暗或过曝 ### 轮廓检测 - 若未检测到四边形轮廓,可调整 Canny 边缘检测的阈值参数(`scan.py` 第 75、200) - 轮廓近似精度系数 `0.02` 可根据实际情况调整(值越小越精确) ### OCR 识别 - 对印刷体文字识别效果较好,手写文字效果较差 - 识别结果为空时,检查 `scan.jpg` 是否清晰,或尝试更换预处理方式 - 如需识别中文,需安装中文语言包并修改调用参数 `lang='chi_sim'` ### 透视变换 - `order_points` 函数必须正确排序四个角点,否则变换结果会变形 - 变换后的图像尺寸基于原始轮廓计算,会自动适应 ## 常见问题 | 问题 | 解决方法 | | :----------------- | :------------------------------------------ | | 未检测到四边形轮廓 | 检查图像是否有明显文档边界,调整 Canny 阈值 | | 透视变换后图像变形 | 检查四个角点是否正确排序 | | OCR 识别结果为空 | 尝试切换预处理方式(thresh ↔ blur) | | 中文识别乱码 | 安装中文语言包,添加 `lang='chi_sim'` 参数 | ## 后续改进方向 - 支持多文档同时检测与识别 - 增加图像去阴影、去噪点功能 - 支持输出为可搜索 PDF 格式 - 集成 PaddleOCR 提升中文识别准确率