仿射变换,简单旋转和缩放或其他完全?

时间:2011-10-17 23:42:17

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

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

orig_image

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

detected_image

在这种情况下,分数为:[1215,43],[52,67],[56,869]和[1216,884]

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

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

A)bad_rect B)ok_rect

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

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

2 个答案:

答案 0 :(得分:6)

我认为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 :(得分:1)

它被称为Keystone校正或梯形失真。它将看起来像梯形的形状转换为矩形。

Book Scan Wizard程序提供了纠正此工件的技巧,您可能需要查看它。