假设多边形不是自相交的,即圆圆周围的点的顺序是单调的,那么我相信有一个相对简单的方法来确定 IoU 值,而不需要一个一般的形状包。
- 假设每个多边形的点是顺时针在圆圈中排列的。如果我们发现签名区域为负值,我们可以通过增加角度 w.r.t x 轴或倒车点来确保这一点。
- 将两个多边形的点合并到单个列表中,跟踪每个点属于哪个多边形。我们还需要能够确定每个点在原始多边形中的上一点和下一点。L
- 通过增加角度来排序w.r.t x轴。L
- 如果输入多边形相交,则从一个多边形到另一个多边形的过渡次数将大于两个。L
- 遍历。如果连续点属于不同的多边形,则第一点与其下一点和第二点之间的线的交叉点及其前一点将属于两个多边形之间的交点。L
- 将步骤 4 中确定的每个点添加到新的多边形中。将按顺序遇到积分。II
- 每个多边形的面积之和将等于其联盟加上交叉口的区域,因为这将计算两次。
- 因此,将的价值由两个多边形的面积之和减去面积之和来表示。IoUII
唯一需要的几何形状是使用Shoelace 公式计算简单多边形的面积,并确定步骤 5 所需的两条线段之间的交汇点。
这里有一些Java代码(Ideone)来说明 - 你也许可以使它在Python更紧凑。
double[][] coords = {
{-0.708, 0.707, 0.309, -0.951, 0.587, -0.809},
{1, 0, 0, 1, -1, 0, 0, -1, 0.708, -0.708}};
double areaSu