手机斜拍页面像梯形,透视变换能校正平面关系,但四角顺序错误会把文字翻转或交叉。
本文使用OpenCV 3.4 与合成几何标尺图。图像预处理会改变坐标,模型结果要回到业务使用的原图基准。本文保存每一步尺寸和变换,不凭最终框看起来大致正确就认定映射无误。
1. 从现象推到机制
单应变换描述平面在两视图间的投影关系,需要非退化且一致排序的对应点。页面弯曲不满足单平面假设。输出宽高也决定比例和像素密度,不能一律拉成任意矩形。
图中的四个节点分别表示页面四角、变换矩阵、目标尺寸、输出检查。顺着实线检查输入如何变成输出,再沿虚线核对反馈条件。图示表达的是本文讨论的关系,不是实测曲线或现场截图。
2. 最小实现与输入条件
在合成斜拍图上标记左上、右上、右下、左下四点,检查边是否交叉,再应用变换。保留原图供结果回溯。
1
2
3
H = cv2.getPerspectiveTransform(source_corners, target_corners)
rectified = cv2.warpPerspective(image, H, (target_w, target_h))
# 四点顺序、类型与目标尺寸由演示数据明确提供
先用已知位置的矩形和标尺做正反向检查,再使用匿名文档。原图、处理图和结果分别保存,重复压缩与插值会影响细节,不能无记录地覆盖源文件。
3. 用对照区分原因
下表列出需要主动改变的条件。预期行为来自机制分析,复现时还需记录运行环境和原始输出,不能将预期当作已经测得的结果。
| 改变的条件 | 需要验证的行为 |
|---|---|
| 四角顺序交叉 | 输出可能扭曲或翻转 |
| 页面明显弯曲 | 单一平面变换难以完整矫正 |
| 输出分辨率过低 | 小字细节可能丢失 |
对照 1:四角顺序交叉
输出可能扭曲或翻转。观察时记录对应点顺序与多边形形状。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。
对照 2:页面明显弯曲
单一平面变换难以完整矫正。观察时记录纸面几何与剩余局部畸变。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。
对照 3:输出分辨率过低
小字细节可能丢失。观察时记录原始像素与目标尺寸。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。
4. 适用条件与取舍
矫正改善几何,不会恢复原图中不存在的细节。下游 OCR 是否受益,需要同一页面的前后对照。
一次正常运行只覆盖了这组输入。继续扩展前,应把上面的异常对照保留下来,尤其关注“输出分辨率过低”这一分支。后续方案若改变了图中任意一处依赖,原来的判断就要重新验证,不能仅凭界面相似或返回值相同沿用结论。