这篇文章主要介绍了怎么使用python在2D中计算多边形IoU的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用python在2D中计算多边形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}};doubleareaSum=0;List<CPoint>pts=newArrayList<>();for(intp=0;p<coords.length;p++){List<CPoint>poly=newArrayList<>();for(intj=0;j<coords[p].length;j+=2){poly.add(newCPoint(p,coords[p][j],coords[p][j+1]));}doublearea=area(poly);if(area<0){area=-area;Collections.reverse(poly);}areaSum+=area;pts.addAll(poly);intn=poly.size();for(inti=0,j=n-1;i<n;j=i++){poly.get(i).prev=poly.get(j);poly.get(j).next=poly.get(i);}}pts.sort((a,b)->Double.compare(a.theta,b.theta));List<Point2D>intersections=newArrayList<>();intn=pts.size();for(inti=0,j=n-1;i<n;j=i++){if(pts.get(j).id!=pts.get(i).id){intersections.add(intersect(pts.get(j),pts.get(j).next,pts.get(i).prev,pts.get(i)));}}doubleareaInt=area(intersections);doubleiou=areaInt/(areaSum-areaInt);System.out.println(iou);

输出:

0.12403616470027268

和支持代码:

staticclassCPointextendsPoint2D.Double{intid;doubletheta;CPointprev,next;publicCPoint(intid,doublex,doubley){super(x,y);this.id=id;theta=Math.atan2(y,x);if(theta<0)theta=2*Math.PI+theta;}}staticdoublearea(List<?extendsPoint2D>poly){doublearea=0;for(inti=0,j=poly.size()-1;i<poly.size();j=i++)area+=(poly.get(j).getX()*poly.get(i).getY())-(poly.get(i).getX()*poly.get(j).getY());returnMath.abs(area)/2;}//https://rosettacode.org/wiki/Find_the_intersection_of_two_lines#JavastaticPoint2Dintersect(Point2Dp1,Point2Dp2,Point2Dp3,Point2Dp4){doublea1=p2.getY()-p1.getY();doubleb1=p1.getX()-p2.getX();doublec1=a1*p1.getX()+b1*p1.getY();doublea2=p4.getY()-p3.getY();doubleb2=p3.getX()-p4.getX();doublec2=a2*p3.getX()+b2*p3.getY();

关于“怎么使用python在2D中计算多边形IoU”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么使用python在2D中计算多边形IoU”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。