1. 项目概述
最近在整理纸质文档时,发现手动拍照存档总会出现角度倾斜、边缘变形的问题。为了解决这个痛点,我用OpenCV实现了一个实时文档扫描工具,能够通过普通摄像头自动检测文档边缘并完成透视矫正。这个方案不需要专业扫描仪,用手机或电脑摄像头就能获得平整的文档图像。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与技术路线
2.1 文档边缘检测技术选型
传统边缘检测算法(如Canny)虽然能提取边缘,但对复杂背景适应性较差。经过对比测试,我最终采用以下处理流程:
- 高斯模糊降噪(5×5核)
- 自适应阈值二值化(blockSize=11,C=2)
- 形态学闭运算(3×3矩形核)
这种组合在实测中对光照变化和背景干扰表现出更好的鲁棒性。关键参数选择依据:
- 高斯核大小需平衡去噪和边缘保留
- 自适应阈值优于全局阈值,适合不均匀光照
- 闭运算可填充文本区域的小间隙
2.2 轮廓查找与文档定位
获取二值图像后,使用findContours查找所有轮廓。通过以下筛选条件确定文档区域:
- 轮廓面积 > 图像面积的15%
- 轮廓为凸四边形
- 长宽比在0.7-1.4之间(兼容A4/A5等常见尺寸)
python复制contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.02*peri, True)
if len(approx) == 4 and cv2.isContourConvex(approx):
# 进一步验证面积和长宽比
2.3 透视变换实现
确定文档四角点后,需要计算变换矩阵。我采用以下步骤:
- 对原始四点按左上、右上、右下、左下顺序排序
- 计算输出图像宽度(取上边和下边的最大值)
- 计算输出图像高度(取左边和右边的最大值)
- 使用getPerspectiveTransform获取变换矩阵
python复制def order_points(pts):
#
