【问题标题】:Affine Transform, Simple Rotation and Scaling or something else entirely?仿射变换、简单旋转和缩放或其他完全?
【发布时间】:2011-12-09 16:43:43
【问题描述】:

场景是这样的:我有一张纸的图片,我想做一些 OCR。所以把下面的图片作为我的输入示例:

在成功检测到与纸张对应的区域后,我留下了一个由 4 个坐标组成的 vector<Point>,定义了它在图像中的位置。请注意,由于相机的距离和拍摄照片时的角度,这些坐标可能不会对应于完美的矩形。出于查看目的,我连接了子图像中的点,以便您了解我的意思:

在这种情况下,点是: [1215, 43] , [52, 67] , [56, 869] 和 [1216, 884]

此时,我需要调整这些点,使它们水平对齐。我的意思是什么?如果您注意到上面子图像的区域,它有点旋转:图像右侧的点比另一侧的点位置稍高。

换句话说,我们有图像 A,它被故意夸大以看起来比现实更扭曲/旋转,然后是图像 B - 这就是我想作为这个过程的最终结果:

A)B)

我不确定哪些技术可以用来实现这种转变。该应用程序还需要自动检测需要进行多少旋转,因为我无法控制图像采集过程。

目的是有一个新的Mat规范化 子图像。我现在并不担心可能的图像失真,我只是在寻找一种方法来确定需要对子图像进行多少旋转以及如何应用它并获得更多矩形区域。

【问题讨论】:

    标签: c++ c opencv image-processing rotation


    【解决方案1】:

    我认为http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/http://felix.abecassis.me/2011/10/opencv-bounding-box-skew-angle/ 会派上用场。上述帖子不涉及透视变形(仅旋转)。要获得最佳结果,您必须使用warpPerspective(可能与getRotationMatrix2D 结合使用)。使用线段之间的角度来找出你需要扭曲透视的程度。这里的假设是它们应该始终是 90 度,并且就视角而言,最接近 90 度的是“最接近”的向量。

    别忘了标准化你的向量!

    【讨论】:

    • +1 并补充说 OP 可能想要阅读 camera calibration。这并不完全是校准,但了解所涉及的射影几何非常有帮助。
    • 这些链接很棒@David,谢谢!我已经实现并测试了这些技术,为了性能起见,我现在坚持使用简单的warpPerspective() 操作,但我知道最终我会回去使用适当的纠偏方法。 This link 也帮了我很多。
    【解决方案2】:

    这称为梯形校正或梯形校正。它将看起来像梯形的形状转换为矩形。

    Book Scan Wizard 程序提供了纠正此伪影的技术,您可能需要检查一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多