c++ - 仿射变换、简单旋转和缩放或其他完全?

标签 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 标准化子图像。我现在并不担心可能的图像失真,我只是在寻找一种方法来确定需要对子图像进行多少旋转以及如何应用它并获得更多 矩形区域

最佳答案

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

别忘了标准化你的 vector !

关于c++ - 仿射变换、简单旋转和缩放或其他完全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800905/

相关文章:

c++ - C++ 在基于 Intel 的系统上使用的 float 的二进制格式是什么?

c++ - 使用eclipse的c++中的简单hello world获取错误bin bash权限被拒绝

c - c中的局部变量和内存

c++ - OpenCV 中的 channel 顺序

c++ - opencv中的轮廓比较

c++ - 如何有效地衡量运行时的差异

c++ - 实现套接字接口(interface)以同时支持 IPV6 和 IPV4 的最佳方式

c - 为什么non-extern可以在C/C++的.h文件中?

c - 如何在C中读取二进制文件并保存到数组?

c++ - OpenCV VideoCapture::set() 返回 false 但成功