【问题标题】:Enlarge and restrict a quadrilateral polygon in opencv 2.3 with C++使用 C++ 在 opencv 2.3 中放大和限制四边形多边形
【发布时间】:2011-11-03 13:18:04
【问题描述】:

我在任何地方都找不到这个答案,希望有人能帮助我。

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    这些点之间的向量是

    v1 = p1 - p
    v2 = p2 - p
    

    (计算分别针对 x 和 y 坐标进行分量计算)。 在收缩多边形中,顶点 p 沿线移动到 p' 它将向量 v1 和 v2 之间的角度 a 减半。 这个方向的向量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 表示 扩大,k

    【讨论】:

    • 非常感谢。它有效,而且以一种非常紧凑的方式。
    • 不处理 quad 的边之一非常小的情况。所以一个内部的offest实际上是一个三角形。用这个方法你会得到一个图8
    【解决方案2】:

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

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

    此函数将 'polys' 多边形参数偏移 'delta' 量。正增量值扩展外部多边形并收缩内部“洞”多边形。负增量则相反。

    虽然我必须添加一个简单的几何图形,例如四边形,但从头开始很容易。

    • 找出构成四边形的所有四条无限线
    • 偏移平行于自身的线
    • 计算这些新线的交点

    请注意极端情况。当您偏移具有一个非常小的边缘的四边形时。它会在偏移上变成一个三角形。

    【讨论】:

    • 谢谢,但我宁愿只使用opencv,不使用外部库。而且你说的几何实现在所有情况下都不起作用:例如,当四边形的边几乎垂直时,这意味着非常高(或低)的斜率,因此 y 的截距非常高(或低)轴,计算这种截距的微小变化不会对平行线产生太大影响。所以在这种情况下我应该使用动态偏移。我使用了 Jiri 解释的向量实现。它奏效了。
    • Jiri 的案例无法处理我在回答中提到的极端案例。我不确定我是否理解你提到的情况。
    • 是的,但就我而言,我不必处理小边缘。您使用 Clipper 库的解决方案将是完美的,但我应该只使用 opencv 库。处理所有平行线然后计算交点有点长,而矢量实现只花了我 10 行 C++ 代码。不过还是谢谢你的帮助。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多