如何计算两个旋转矩形的重叠比率?

3

假设有两个矩形,我们已知它们的四个角的位置、宽度、高度和角度。如何计算这两个矩形之间的重叠比例呢?你能帮我解决这个问题吗?


我不太了解OpenCV,但你能否用两种不同的颜色,比如红色和蓝色来绘制和叠加它们,然后计算紫色像素的数量? - Mark Setchell
@Mark Setchell,你可以这样做,但是这个解决方案可能会非常昂贵。你可能需要渲染和计算数百万像素。此外,这将降低结果的准确性。 - Michael Burdinov
3个回答

2
一种方便的方法是使用Sutherland-Hodgman多边形剪切算法。它通过将其中一个多边形与另一个多边形的四条支持线(半平面)进行剪切来实现。最终,您会得到交集多边形(最坏情况下为八边形),并通过多边形面积公式计算其面积。

enter image description here

通过在原点周围对多边形进行逆旋转,使其中一个多边形成为轴平行,可以更轻松地进行裁剪。这不会改变面积。
请注意,这种方法很容易推广到两个一般的凸多边形,需要O(N.M)次操作。G.T. Toussaint使用旋转卡尺原理将工作量减少到O(N+M),而B. Chazelle和D.P. Dobkin则表明,可以在O(Log(N+M))次操作中检测到非空交集。这表明,即使N=M=4是一个微小的问题,S-H剪辑方法可能还有一些改进空间。

1
+1,但您必须提到两个矩形的旋转应围绕同一点进行。如果不是同一点(例如每个矩形都围绕其自身中心旋转),则答案将不正确。这是一个非常常见的错误。 - Michael Burdinov
为了取悦@Michael Burdinov,我添加了绕原点旋转的功能,这使得旋转公式变得最简单。 - user1196549

1

0
假设你有矩形A和B,那么你可以使用以下操作:
 intersection_area =  (A & B).area(); 

从这个区域,您可以计算出相对于其中一个矩形的比率。当然,还有更难更动态的方法来实现这一点。


1
哈哈,我也有同样的想法,但对于RotatedRect不是这样。 - berak
1
在这种情况下,既然我们知道每个矩形的点, 就用与原始图像相同大小的不同Mat绘制每个矩形。 然后执行AND运算并计算输出中非零像素的数量。 这将给出两个形状共享的像素数。 - Tiago Ferreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接