使用C ++在opencv 2.3中放大和限制四边形多边形

时间:2011-11-03 13:18:04

标签: c++ opencv

我无法在任何地方找到这个答案,我希望有人可以帮助我。

我有一个图像(全黑),里面有一个白色的通用四边形多边形,以及这个多边形的对应4个角坐标。

我需要找到一个略微放大的四边形的角落,并略微减少一个角落(形状必须相同,只是调整图像中的四边形的大小)。

是否有允许我这样做的功能,还是应该手动计算某些几何图形?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

考虑多边形的顶点p,其前身为p1,后继为p2。

enter image description here

这些点之间的向量是

v1 = p1 - p
v2 = p2 - p

(分别对x和y坐标进行计算)。 在收缩的多边形中,顶点p沿着线移动到p' 它将矢量v1和v2之间的角度α减半。 向这个方向的向量是

w = v1 + v2

,此方向的单位矢量v为

v = w / |w| = (w_x, w_y) / sqrt(w_x*w_x + w_y*w_y)

新点p'是

p' = p + k * v ,  i.e. :
p_x' = p_x + k * v_x
p_y' = p_y + k * v_y

其中k是移动距离(标量)。

如果顶点p是凸的(如图中所示),则k> = 0表示 收缩和k <= 0意味着扩张。 如果顶点p是凹的,则k> = 0表示 扩张和k <= 0意味着缩小。

答案 1 :(得分:0)

你想要的是多边形偏移。如果要使用现有库。考虑使用Clipper

     void OffsetPolygons(const Polygons &in_polys, 
         Polygons &out_polys, 
         double delta, 
         JoinType jointype = jtSquare, double MiterLimit = 2.0);

此函数将'多边形'多边形参数偏移'delta'金额。正delta值扩展外多边形并收缩内部'洞'多边形。负面的增量反过来。

虽然我必须添加像Quadrilateral这样的简单几何体,但很容易从头开始。

  • 识别构成四边形的所有四条无限线
  • 偏移与自身平行的线
  • 计算这些新行的交集

小心角落情况。当您偏移具有一个非常小边缘的四边形时。它将成为偏移的三角形。

答案 2 :(得分:-1)

我同意parapura rajkumar的回答。我想补充一点,Jiri的解决方案并非100%正确,因为四边形的顶点质心与四边形的区域质心不同,因为它写成here。对于放大,必须使用区域质心 - 或更加优雅solutionparapura rajkumar提到的平行线。我只想在这个答案中添加以下内容:

您可以通过计算原始四边形的点之间的矢量的法向矢量来简单地确定放大的四边形的外部点。然后,对法向量进行归一化,将它们与偏移相乘,并将它们加到原始四边形的点上。给定这些外部点,您现在可以计算平行线与此formula的交集。