当前位置: 代码迷 >> 综合 >> 计算IOU of two rectangles
  详细解决方案

计算IOU of two rectangles

热度:38   发布时间:2023-11-26 06:50:22.0

题目

给两个rectangle,boxA:[x1,y1,x2,y2], boxB:[x3,y3,x4,y4]。前两个坐标代表upper left point,后两个座标代表bottom right point,并且假设x向右为正方向,y向下为正方向。主要思想是,相交的区域的upper left point是A和B upper left point中的一个,相交的区域的的bottom right point是A和B的bottom point中的一个。代码如下:

def cal_iou(boxA,boxB):# the (x,y) of upper left point of intersect region will be the max of (x,y) of upper left point of boxA and boxBxA = max(boxA[0],boxB[0])yA = max(boxA[1],boxB[1])# the (x,y) of bottom right point of intersect region will be the min of (x,y) of bottom right point of boxA and boxBxB = min(boxA[2],boxB[2])yB = min(boxA[3],boxB[3])print(xA,yA,xB,yB)#compute the area of the intectsect regioninterArea = abs(max(xB-xA,0)*max(yB-yA,0))print(interArea)if interArea == 0:return 0# compute the overall areaboxAArea = abs(boxA[0]-boxA[2])*abs(boxA[1]-boxA[3])boxBArea = abs(boxB[0]-boxB[2]) * abs(boxB[1]-boxB[3])# compute IOUiou = interArea/(boxAArea+boxBArea-interArea)return iouboxA = [0,0,2,2]
boxB = [1,1,3,3]
print(cal_iou(boxA,boxB))
boxA = [0,0,3,3]
boxB = [1,1,2,2]
print(cal_iou(boxA,boxB))
boxA = [0,0,1,1]
boxB = [2,2,3,3]
print(cal_iou(boxA,boxB))

这段代码对于不相交或者一个被另一个包括的情况都正确。唯一要注意的是,给的坐标必须要代表左上角和右下角点,x的正方向向右,y的正方向向下。如果坐标和方向表示不一致,需要改代码,但是核心思想是一样的。不过面试的时候肯定可以自己这么定义就对了