nms 交并比计算
c++ 代码解析
static inline float intersection_area(const Object& a, const Object& b) { if (a.x > b.x + b.w || a.x + a.w < b.x || a.y > b.y + b.h || a.y + a.h < b.y) { // no intersection return 0.f; } float inter_width = std::min(a.x + a.w, b.x + b.w) - std::max(a.x, b.x); float inter_height = std::min(a.y + a.h, b.y + b.h) - std::max(a.y, b.y); return inter_width * inter_height; }
这段代码定义了一个静态内联函数 intersection_area
,用于计算两个物体(Object)之间的交集面积。函数的输入参数为两个 Object
类型的引用,分别命名为 a
和 b
。
函数首先通过检查两个物体之间的位置关系来判断它们是否相交。如果两个物体不相交,即其中一个物体在另一个物体的左侧、右侧、上方或下方,则返回的交集面积为 0。
如果两个物体相交,则计算它们相交部分的宽度和高度,并将其相乘得到交集面积。具体的计算过程如下:
-
如果
a
物体的右边界在b
物体的左边界的左侧,或者a
物体的左边界在b
物体的右边界的右侧,则两个物体没有水平方向上的重叠,此时交集宽度为 0。 -
如果
a
物体的下边界在b
物体的上边界的上方,或者a
物体的上边界在b
物体的下边界的下方,则两个物体没有垂直方向上的重叠,此时交集高度为 0。 -
否则,计算水平方向上的交集宽度为两个物体右边界的最小值减去左边界的最大值,计算垂直方向上的交集高度为两个物体下边界的最小值减去上边界的最大值。
-
最后,返回交集宽度和交集高度的乘积,即为交集面积。
这个函数是对物体之间相交情况的一种简单判断和计算,常用于目标检测等应用中,以评估检测到的物体之间的重叠程度。
python实现
def intersection_area(a, b):
"""
计算两个边界框之间的交集面积
参数:
a: 第一个边界框,表示为 (x, y, w, h),其中 (x, y) 是左上角坐标,w 和 h 是宽度和高度
b: 第二个边界框,表示为 (x, y, w, h),其中 (x, y) 是左上角坐标,w 和 h 是宽度和高度
返回值:
两个边界框的交集面积
"""
# 计算交集区域的坐标
x1 = max(a[0], b[0])
y1 = max(a[1], b[1])
x2 = min(a[0] + a[2], b[0] + b[2])
y2 = min(a[1] + a[3], b[1] + b[3])
# 检查是否存在交集
if x1 >= x2 or y1 >= y2:
return 0.0
# 计算交集区域的宽度和高度
inter_width = x2 - x1
inter_height = y2 - y1
# 计算交集面积
intersection_area = inter_width * inter_height
return intersection_area
# 示例用法
box1 = (100, 100, 100, 100) # (x, y, w, h)
box2 = (150, 150, 100, 100) # (x, y, w, h)
area = intersection_area(box1, box2)
print("交集面积:", area)