Manipulate bounding boxes as objects
Project description
bbox-objected
Makes manipulations with bounding boxes easier in Computer Vision projects. With zero dependencies by default.
Installation:
pip install bbox-objected
Optional dependencies:
pip install numpy
pip install opencv-python
or pip install opencv-contrib-python
Examples:
AbsBBox
is needed to store absolute coordinates (uses int
type strictly)
from bbox import AbsBBox
bbox = AbsBBox((35, 45, 100, 80), kind="coco", text="abs_sample")
print(bbox)
# <AbsBBox(x1=35, y1=45, x2=135, y2=125) - abs_sample>
print(bbox.get_pascal_voc()) # you can get coords in specific formats
# (35, 45, 135, 125)
If you need to store relative coordinates, you can use RelBBox
(values in range [0., 1.])
from bbox import RelBBox
bbox = RelBBox((0.1, 0.2, 0.5, 0.6), kind="horizontal_list", text="rel_sample")
print(bbox)
# <RelBBox(x1=0.1, y1=0.5, x2=0.2, y2=0.6) - rel_sample>
print(bbox.get_free_list())
# ((0.1, 0.5), (0.2, 0.5), (0.2, 0.6), (0.1, 0.6))
Conversion between types is available
from bbox import RelBBox
bbox = RelBBox((0.1, 0.2, 0.5, 0.6), kind="pascal_voc", text="sample")
print(bbox)
# <RelBBox(x1=0.1, y1=0.2, x2=0.5, y2=0.6) - sample>
print(bbox.as_abs(1920, 1080)) # size of image is necessary for conversion
# <AbsBBox(x1=192, y1=216, x2=960, y2=648) - sample>
print(bbox.as_abs(1920, 1080).as_rel(1920, 1080)) # each conversion creates new instance
# <RelBBox(x1=0.1, y1=0.2, x2=0.5, y2=0.6) - sample>
There is a bunch of attributes for each bbox
from bbox import RelBBox, AbsBBox
bbox = RelBBox((0.4, 0.4, 0.6, 0.6))
print(bbox.x1, bbox.y1, bbox.x2, bbox.y2)
# 0.4 0.4 0.6 0.6
print(bbox.w, bbox.h)
# 0.2 0.2
print(bbox.tl, bbox.tr, bbox.br, bbox.bl) # corners
# (0.4, 0.4) (0.6, 0.4) (0.6, 0.6) (0.4, 0.6)
bbox = AbsBBox((40, 40, 60, 60))
print(bbox.center, bbox.area)
# (50.0, 50.0) 400
print(bbox.xc, bbox.yc)
# 50.0 50.0
Available kinds of bboxes:
from bbox.types import BBoxKind
BBoxKind.free_list = "tl_tr_br_bl" # special format of 'EasyOCR' library
BBoxKind.tl_tr_br_bl = "tl_tr_br_bl"
BBoxKind.horizontal_list = "x1x2y1y2" # special format of 'EasyOCR' library
BBoxKind.x1x2y1y2 = "x1x2y1y2"
BBoxKind.pascal_voc = "x1y1x2y2" # own format of PascalVOC image dataset
BBoxKind.x1y1x2y2 = "x1y1x2y2"
BBoxKind.coco = "x1y1wh" # own format of COCO image dataset
BBoxKind.x1y1wh = "x1y1wh"
BBoxKind.pywinauto = "pywinauto" # gets object of '.rectangle()' method of 'PyWinAuto' library
BBoxKind.winocr = "winocr" # gets special coords format of 'WinOCR' library
BBoxKind.mss = "mss" # gets 'monitor' object of library 'mss'
There is respective get_
method for each bbox kind, except "pywinauto"
and "winocr"
Some simple editing of bboxes is also available
from bbox import AbsBBox
bbox = AbsBBox((100, 200, 300, 400))
print(bbox)
# <AbsBBox(x1=100, y1=200, x2=300, y2=400)>
bbox.zero_basis()
print(bbox)
# <AbsBBox(x1=0, y1=0, x2=200, y2=200)>
bbox.move_basis(25, 45)
print(bbox)
# <AbsBBox(x1=25, y1=45, x2=225, y2=245)>
other_bbox = AbsBBox((200, 300, 400, 500))
print(other_bbox)
# <AbsBBox(x1=200, y1=300, x2=400, y2=500)>
bbox.update_from(other_bbox) # choose coords to get max area, don't create new instance
print(bbox)
# <AbsBBox(x1=25, y1=45, x2=400, y2=500)>
bbox.replace_from(other_bbox) # takes all coords from 'other', don't create new instance
print(bbox)
# <AbsBBox(x1=200, y1=300, x2=400, y2=500)>
Additional functionality:
Each bbox can be drawn or cropped from image. Can work both with AbsBBox
and RelBBox
import numpy as np
from bbox import AbsBBox
bbox = AbsBBox((100, 200, 300, 400)) # 'pascal_voc' bbox kind is default
img = np.empty((512, 512, 3), dtype=np.uint8) # random RGB image
cropped = bbox.crop_from(img) # 'numpy' must be installed
print(cropped.shape)
# (200, 200, 3)
bbox.show_on(img, text="sample") # 'opencv' must be installed
Also, there are several useful functions. Currently works only with AbsBBox
.
from bbox import AbsBBox
from bbox.bbox_utils import get_distance, get_IoU, get_cos_between
bbox_1 = AbsBBox((100, 200, 300, 400), kind="x1y1wh")
bbox_2 = AbsBBox((100, 400, 100, 400), kind="horizontal_list")
print(get_distance(bbox_1, bbox_2))
# 150.0
print(get_IoU(bbox_1, bbox_2)) # Intersection over Union (ratio of intersection)
# 0.4
print(get_cos_between(bbox_1, bbox_2, 450, 350)) # angle around center in (450 ,350)
# 0.7592566023652966
import numpy as np
from bbox.cv_utils import resize
img = np.empty((512, 512, 3), dtype=np.uint8)
resized = resize(img, height=128) # aspect ratio will be saved
print(resized.shape)
# (128, 128, 3)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for bbox_objected-0.1.6-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1d650f5a08abaec4b25a1ac7c7abe81f38f2d034c4ccc120a70e3f0deb2a5b7d |
|
MD5 | 2a88938c0a941b0069a57c5dbe4bc2e2 |
|
BLAKE2b-256 | c0862bd510039d27e5d6903f35374cccff9bc7c923e2c4466834c91fd6514c75 |