import numpy as np
import cv2
def iou(bbox1, bbox2, center=False):
"""Compute the iou of two boxes. Parameters ---------- bbox1, bbox2: list. The bounding box coordinates: [xmin, ymin, xmax, ymax] or [xcenter, ycenter, w, h]. center: str, default is 'False'. The format of coordinate. center=False: [xmin, ymin, xmax, ymax] center=True: [xcenter, ycenter, w, h] Returns ------- iou: float. The iou of bbox1 and bbox2. """
if center == False:
xmin1, ymin1, xmax1, ymax1 = bbox1
xmin2, ymin2, xmax2, ymax2 = bbox2
else:
xmin1, ymin1 = int(bbox1[0] - bbox1[2] / 2.0), int(bbox1[1] - bbox1[3] / 2.0)
xmax1, ymax1 = int(bbox1[0] + bbox1[2] / 2.0), int(bbox1[1] + bbox1[3] / 2.0)
xmin2, ymin2 = int(bbox2[0] - bbox2[2] / 2.0), int(bbox2[1] - bbox2[3] / 2.0)
xmax2, ymax2 = int(bbox2[0] + bbox2[2] / 2.0), int(bbox2[1] + bbox2[3] / 2.0)
xx1 = np.max([xmin1, xmin2])
yy1 = np.max([ymin1, ymin2])
xx2 = np.min([xmax1, xmax2])
yy2 = np.min([ymax1, ymax2])
area1 = (xmax1 - xmin1 + 1) * (ymax1 - ymin1 + 1)
area2 = (xmax2 - xmin2 + 1) * (ymax2 - ymin2 + 1)
inter_area = (np.max([0, xx2 - xx1])) * (np.max([0, yy2 - yy1]))
iou = inter_area / (area1 + area2 - inter_area + 1e-6)
return iou
def main():
img_dir = 'image/dog-cycle-car.png'
img = cv2.imread(img_dir)
bbox1 = [101, 169, 246, 429]
bbox2 = [121, 138, 304, 374]
cv2.rectangle(img, (bbox1[0],bbox1[1]), (bbox1[2],bbox1[3]), (0, 255, 0), 2)
cv2.rectangle(img, (bbox2[0],bbox2[1]), (bbox2[2],bbox2[3]), (255, 0, 0), 2)
rst = iou(bbox1, bbox2)
print('iou:', rst)
cv2.putText(img, 'iou: %.6f' % rst, (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
cv2.imwrite('image/iou_rst.png', img)
cv2.imshow('iou_rst',img)
cv2.waitKey(0)
if __name__ == "__main__":
main()
Technical Exchange
![【CV基石】计算两个矩形框的IOU_第2张图片](http://img.e-com-net.com/image/info8/531aca4330094cb5b9299e3fed03a40c.jpg)