Dealing with the bounding box is pretty common and important in the related tasks of object detection or tracking, such as Yolo and Deepsort. Handling with bbox can greatly reduce the development time and reduce the chance of errors on bounding box.
Installing bbox and the dependencies via pip
pip install git+https://github.com/Pandede/bboxfrom bbox import BoundingBox
# Create a bounding box in format `xywh`
bbox = BoundingBox(x=0, y=0, w=10, h=10)
# ... or in format `xyxy`
bbox = BoundingBox.from_xyxy(0, 0, 10, 10)
# ... or in format `tlwh`
bbox = BoundingBox.from_tlwh(0, 0, 10, 10)
# Get the width and height
print(bbox.width, bbox.height) # 10 10
# ... or in short form
w, h = bbox.w, bbox.h # 10 10
# Get the area
print(bbox.area) # 100
# Check if the bounding boxes are identical
bbox_a = BoundingBox(x=0, y=0, w=10, h=10)
bbox_b = BoundingBox.from_xyxy(-5, -5, 5, 5)
print(bbox_a == bbox_a) # Truefrom bbox import BoundingBox
# Get the coordinate of edge point by calling `anchor(index)`
# The returned point refers to the position of number on NumPad:
# 7---8---9
# | |
# 4 5 6
# | |
# 1---2---3
bbox = BoundingBox.from_xyxy(0, 0, 10, 10)
# Get the coordinate of bottom-left point
print(bbox.anchor(1)) # (0, 10)
# Get the coordinate of center point
print(bbox.anchor(5)) # (5, 5)from bbox import BoundingBox
# The `BoundingBox` object stores the attributes `xywh`
bbox = BoundingBox(x=5, y=5, w=10, h=10)
print((bbox.x, bbox.y, bbox.w, bbox.h)) # (5, 5, 10, 10)
# Format it to `xyxy`
print(bbox.to_xyxy()) # (0, 0, 10, 10)
# Format it to `tlwh`
print(bbox.to_tlwh()) # (0, 0, 10, 10)from bbox import BoundingBox
from bbox.measure import union, intersect
bbox_a = BoundingBox.from_xyxy(0, 0, 10, 10)
bbox_b = BoundingBox.from_xyxy(5, 5, 15, 15)
# Get the union area of bounding boxes
print(union(bbox_a, bbox_b)) # 175
# Get the intersection area of bounding boxes
print(intersect(bbox_a, bbox_b)) # 25from bbox import BoundingBox
from bbox.measure import iou, giou, diou, ciou
bbox_a = BoundingBox.from_xyxy(0, 0, 10, 10)
bbox_b = BoundingBox.from_xyxy(5, 5, 15, 15)
# Compute the IoU and its variation
print(f'IoU: {iou(bbox_a, bbox_b):.6f}') # IoU: 0.142857
print(f'GIoU: {giou(bbox_a, bbox_b):.6f}') # GIoU: -0.079365
print(f'DIoU: {diou(bbox_a, bbox_b):.6f}') # DIoU: 0.0153061
print(f'CIoU: {ciou(bbox_a, bbox_b):.6f}') # CIoU: 0.0153061