【问题标题】:How to programatically find orientation of polygon?如何以编程方式查找多边形的方向?
【发布时间】:2016-07-22 10:22:16
【问题描述】:

我有以下轮廓(最大的深蓝色多边形):

这张照片由智能手机拍摄并由 OpenCV 处理。最终我想识别这张卡底部的数字(请忽略条形码)。

我的下一步是在3x3 transformation matrix 上倾斜(warp the perspective of)这张图片。预期结果示例:

请注意,该示例缺少实际的图像数据。

问题:如何获取3x3 transformation matrix

我过去的尝试:

  1. 将轮廓的多个相似线段替换为一个。
  2. 查找最大的 4 个段
  3. 假设这 4 段形成矩形
  4. 将图像扭曲到矩形的角度

我的意思是:具有几乎相同角度的线段。

但是,这并不能给我准确的结果。我所希望的是一种近乎完美的算法,可用于文本识别。

我更喜欢包含某种程序语言或伪代码的答案。

【问题讨论】:

  • 1.我只看到一个 2D 图像。 2D 空间中的多边形没有 3D 方向。 2. 每个多边形都适合一个矩形 3. 你在说什么段?你把它们粘在一起是什么意思 4.“这不能给我准确的结果”:它给你什么结果,什么是准确的? 5.“我想要一个近乎完美的算法”:距离圣诞节还有 8 个月。 6. 到目前为止你还没有提到任何图像处理。到目前为止,您是如何处理图像的?
  • 一张图片无法获得 3D 效果
  • 来自一台摄像机——你记下了这些台词吗?我不明白 - 你在卡片上标记了线条吗 - 你需要两个 3D 摄像头
  • @Tim:您已检测到带有文本的区域。然后您可以提取轮廓,找到四个主要边界(霍夫变换),然后找到交点,就可以了!
  • @FiReTiTi 是的,谢谢。这已经奏效了。

标签: algorithm math image-processing 3d polygon


【解决方案1】:

来自 cmets 的解决方案:计算单应矩阵。

  1. 您从包含文本的多边形开始
  2. 你提取轮廓
  3. 霍夫变换找到四个边
  4. 线相交以找到多边形
  5. 此多边形与您需要的多边形之间的单应矩阵。

【讨论】:

  • 它需要一些调整。霍夫变换每边检测到多条线,即使参数范围很广。因此,需要将这些线识别为相似并将它们合并在一起以获得正确的交叉点。无论如何,感谢您的解决方案!
【解决方案2】:

忘记一个矩形,只针对你知道的图案进行优化 - 选择一个起始边缘(任何边缘),走向图像的中心直到你碰到一条蓝线,然后沿着这条线找到两端蓝线 x1,y1 和 x2,y2。你如何做到这一点将完全取决于语言和表示,所以我提供的任何伪代码都可能是浪费时间。

使用这两个点,计算旋转角度 - 你如何做这将取决于你选择的边缘,但例如,对于顶线,你可以使用

angle = tangent( (y2 - y1) / (x2 - x1) )

用这条线组成一个三角形,水平线由上面的y坐标组成,垂直线由最右边的x坐标组成。

这将为您提供所需的角度,因此在这种情况下您将需要旋转-angle(您可以在一次操作中计算正确的角度,但如果您计算角度,则更容易可视化图片在现在。

由于您指定图像适合矩形,因此您根本不需要矩形的所有其他边,只需要一个。如果图像总是有点垂直(并且只是从正常的垂直轴倾斜),您可以选择一个边缘并始终使用它来找到该边缘的线。

如果图像可能旋转 90 度或更多,您可以选择两个相邻的边缘(例如顶部和左侧),找到每条边缘上蓝线的末端(它们应该大部分相交),然后选择较长的两者用于计算,因为较长的线会减少计算角度时的舍入误差。

【讨论】:

  • 感谢您的回答,但它不会改变视角。如果我要在所有方面重复你的解决方案,我基本上会执行我已经做过的事情,而且还不够准确。
  • 您询问如何找到正确的视角,以便将图像扭曲到正确的方向;你的意思是问如何扭曲图像本身?大多数图像处理库都包含旋转作为内置功能,所以我对您的要求感到困惑。
  • 不,我的意思是这不能处理在透视图中转换多边形。它确实需要在 X、Y 和 Z 轴上旋转。
  • @Tim 你的头衔会询问卡片的方向。在二维图像中只有一种方向(旋转)。我建议你适当地重写你的问题
  • @Piglet 卡片里的卡片是3D方向的,其实没那么难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多