一、先将两个框转换为角点形式
一般我们得到的是中心点,宽高,和旋转角度。通过矢量旋转公式得到角点形式。
二、判断四个角点是否在对方的框里,并保存在里面的角点
A的角点向B的相邻的两条边投影(任意的B的两条边),使用向量点积得到, 点积的值必须大于0且小于所投向的边的长度。否则就不在里面。如果都不在对方的里面的iou为0,不用进行下面的了
三、求两个边框的交点,既然有角点在里面,肯定有线段相交点。
遍历四个边和另外四个边求交点。我们设A线段有两个点a1和a2,B线段有两个点b1和b2,如果两个线段相交,则a1b1向量和a1b2向量的叉乘与a2b1和a2b2的叉乘符号肯定相反,同时b1a1和b1a2的叉乘与b2a1和b2a2的叉乘符号肯定也相反,其实也就是角度问题,大家可以画图验证。
如果线段有交点,那我们就求出交点,和第二步保存的角点放一起。
四、对保存的点进行顺时针排序(为了求相交面积)
排序的流程,先求所有保存点的平均值作为向量起始点M,求M指向所有保存点的归一化向量。每个向量都有个x,y,如果y小于0,那么他的x就等于-2-x,最终根据修改后的x对所有保存点进行排序。
五、根据排序点使用三角剖分求相交面积
选取第一个排序点作为出发点,往后再取两个点求三角形面积(叉乘),第一个点不变,往后推一位再取两个点求三角形面积。举个例子 有点[1,2,3,4]先选中1,取23求面积,再选1,往后推一位ie,取两个为34求面积,这时求和就得到了四边形的面积。
六、代码以及参考文章(他讲的更细致)
(84条消息) Rotated IoU 计算_旋转iou_THE@JOKER的博客-CSDN博客