如何以编程方式找到多边形的方向?
How to programatically find orientation of polygon?
我有以下轮廓(最大的深蓝色多边形):
这张照片是用智能手机拍摄的,用OpenCV处理的。最后我想识别这张卡底部的数字(请忽略条形码)。
我的下一步是将此图像(warp the perspective)倾斜到 3x3 transformation matrix
上。预期结果示例:
请注意,该示例缺少实际图像数据。
问:如何获得3x3 transformation matrix
?
我过去尝试过的:
- 用一个替换轮廓的多个相似线段。
- 找到最大的 4 个片段
- 假设这 4 段构成矩形
- 在矩形的视角上扭曲图像
相似我的意思是:角度几乎相同的线段。
但是,这并没有给我准确的结果。我所希望的是一种近乎完美的算法,我可以将其用于文本识别。
我更喜欢包含某种程序语言或伪代码的答案。
忘掉矩形,只优化你知道的模式 - 选择一个起始边(任何边),走向图像的中心直到你碰到一条蓝线,然后沿着这条线找到两条线蓝线 x1,y1 和 x2,y2 的末端。你如何做到这一点将完全取决于语言和表示,所以我提供的任何伪代码都可能是浪费时间。
利用这两个点,计算旋转角度 - 如何执行此操作将取决于您选择的边,但是例如,对于顶线,您可以使用
angle = tangent( (y2 - y1) / (x2 - x1) )
利用直线与上面的y坐标形成的水平线和最右边的x坐标形成的垂直线形成三角形。
这会给你一个你想要的角度,所以在这种情况下你会想要旋转 -angle
(你可以在一次操作中计算出正确的角度,但如果你计算图像现在所处的角度。
由于您指定图像适合一个矩形,因此您根本不需要矩形的所有其他边,只需要一个边。如果图像总是有点垂直(并且只是偏离正常的垂直轴),您可以 select 一条边并始终使用它来找到该边的线。
如果图像可能旋转了 90 度或更多,您可以选择两个相邻的边缘(例如顶部和左侧),找到每条边缘上蓝线的末端(它们应该大部分相交),然后选择两者中较长的用于计算,因为较长的线会在计算角度时减少舍入误差。
评论中的解决方案:计算单应矩阵。
- 您从包含文本的多边形开始
- 你提取轮廓
- 霍夫变换求四个边
- 线相交找到多边形
- 此多边形与您需要的多边形之间的单应矩阵。
我有以下轮廓(最大的深蓝色多边形):
这张照片是用智能手机拍摄的,用OpenCV处理的。最后我想识别这张卡底部的数字(请忽略条形码)。
我的下一步是将此图像(warp the perspective)倾斜到 3x3 transformation matrix
上。预期结果示例:
请注意,该示例缺少实际图像数据。
问:如何获得3x3 transformation matrix
?
我过去尝试过的:
- 用一个替换轮廓的多个相似线段。
- 找到最大的 4 个片段
- 假设这 4 段构成矩形
- 在矩形的视角上扭曲图像
相似我的意思是:角度几乎相同的线段。
但是,这并没有给我准确的结果。我所希望的是一种近乎完美的算法,我可以将其用于文本识别。
我更喜欢包含某种程序语言或伪代码的答案。
忘掉矩形,只优化你知道的模式 - 选择一个起始边(任何边),走向图像的中心直到你碰到一条蓝线,然后沿着这条线找到两条线蓝线 x1,y1 和 x2,y2 的末端。你如何做到这一点将完全取决于语言和表示,所以我提供的任何伪代码都可能是浪费时间。
利用这两个点,计算旋转角度 - 如何执行此操作将取决于您选择的边,但是例如,对于顶线,您可以使用
angle = tangent( (y2 - y1) / (x2 - x1) )
利用直线与上面的y坐标形成的水平线和最右边的x坐标形成的垂直线形成三角形。
这会给你一个你想要的角度,所以在这种情况下你会想要旋转 -angle
(你可以在一次操作中计算出正确的角度,但如果你计算图像现在所处的角度。
由于您指定图像适合一个矩形,因此您根本不需要矩形的所有其他边,只需要一个边。如果图像总是有点垂直(并且只是偏离正常的垂直轴),您可以 select 一条边并始终使用它来找到该边的线。
如果图像可能旋转了 90 度或更多,您可以选择两个相邻的边缘(例如顶部和左侧),找到每条边缘上蓝线的末端(它们应该大部分相交),然后选择两者中较长的用于计算,因为较长的线会在计算角度时减少舍入误差。
评论中的解决方案:计算单应矩阵。
- 您从包含文本的多边形开始
- 你提取轮廓
- 霍夫变换求四个边
- 线相交找到多边形
- 此多边形与您需要的多边形之间的单应矩阵。