2011-11-03 110 views
1

我无法在任何地方找到此答案,我希望有人能帮助我。使用C++在opencv 2.3中放大并限制四边形多边形

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

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

是否有一个允许我这样做的函数,还是我应该手动计算一些几何?

谢谢你的帮助。

回答

2

考虑多边形的一个顶点p,它的前一个p1和后一个p2。

enter image description here

这些点之间的矢量是

v1 = p1 - p 
v2 = p2 - p 

(计算是对x分量型和y分别坐标)。 在缩小的多边形中,顶点p沿线 移动到p',该线将矢量v1和v2之间的角度α减半。 在此方向上的向量,w是

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意味着收缩。

+0

非常感谢。它能够工作,而且工作非常紧凑。 – imby

+0

四边形的边缘之一非常小时,不处理这种情况。所以一个内部实际上是一个三角形。用这种方法你会得到一个数字8 –

0

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

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

该功能由“增量”量抵消“多边形”的多边形参数。正三角洲值展开外部多边形并收缩内部'洞'多边形。消极的三角洲正好相反。

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

  • 身份平行于自身形成的四边形
  • 偏移线全部四个无限线
  • 这些新线
  • 的计算交集

只是要小心的角落案件。当你偏移一个非常小的四边形时。它将成为偏移量的三角形。

+0

谢谢,但我宁愿只使用opencv,不要使用外部库。你所说的几何实现在任何情况下都不起作用:例如,当四边形有一个几乎垂直的边时,这意味着非常高(或低)的斜率,因此极高(或低)的截距y轴,计算这种截距的微小变化并不会影响平行线。所以我应该在这种情况下使用动态偏移。 我使用了Jiri解释的矢量实现。有效。 – imby

+0

吉日的案件不处理我在我的答案中提到的角落案件。我不确定我了解你提到的情况。 –

+0

是的,但在我的情况下,我不必处理小边缘。使用Clipper库的解决方案将是完美的,但我应该只使用opencv库。 处理所有的平行线,然后计算交点有点长,而矢量实现只需要10行C++代码。 但是,无论如何,谢谢你的帮助。 – imby