Since the post is very related to computer vision and object detection, I thought of putting some code together that I use for finding the intersection of bounding boxes and also finding their intersection over union (IoU). This code was originally developed by Adrian Rosebrock in this blog post:
This is the module (where I named it Bbox
):
class Bbox:
def __init__(self, x1, y1, x2, y2):
self.x1 = max(x1, x2)
self.x2 = min(x1, x2)
self.y1 = max(y1, y2)
self.y2 = max(y1, y2)
self.box = [self.x1, self.y1, self.x2, self.y2]
self.width = abs(self.x1 - self.x2)
self.height = abs(self.y1 - self.y2)
@property
def area(self):
"""
Calculates the surface area. useful for IOU!
"""
return (self.x2 - self.x1 + 1) * (self.y2 - self.y1 + 1)
def intersect(self, bbox):
x1 = max(self.x1, bbox.x1)
y1 = max(self.y1, bbox.y1)
x2 = min(self.x2, bbox.x2)
y2 = min(self.y2, bbox.y2)
intersection = max(0, x2 - x1 + 1) * max(0, y2 - y1 + 1)
return intersection
def iou(self, bbox):
intersection = self.intersection(bbox)
iou = intersection / float(self.area + bbox.area - intersection)
# return the intersection over union value
return iou
And to use it:
a = Bbox([516, 289, 529, 303])
b = Bbox([487, 219, 533, 342])
result = a.intersect(b)