nooneshouldtouch's picture
ok
1f85df6
raw
history blame
2.18 kB
import cv2
import numpy as np
import matplotlib as mpl
def letterbox_image(image, size):
'''
Resize image with unchanged aspect ratio using padding
'''
# original image size
ih, iw, ic = image.shape
# given size
h, w = size
# scale and new size of the image
scale = min(w/iw, h/ih)
nw = int(iw*scale)
nh = int(ih*scale)
# placeholder letter box
new_image = np.zeros((h, w, ic), dtype='uint8') + 128
# top-left corner
top, left = (h - nh)//2, (w - nw)//2
# paste the scaled image in the placeholder anchoring at the top-left corner
new_image[top:top+nh, left:left+nw, :] = cv2.resize(image, (nw, nh))
return new_image
def draw_detection(
img,
boxes,
class_names,
# drawing configs
font=cv2.FONT_HERSHEY_DUPLEX,
font_scale=0.5,
box_thickness=2,
border=5,
text_color=(255, 255, 255),
text_weight=1
):
'''
Draw the bounding boxes on the image
'''
# generate some colors for different classes
num_classes = len(class_names) # number of classes
colors = [mpl.colors.hsv_to_rgb((i/num_classes, 1, 1)) * 255 for i in range(num_classes)]
# draw the detections
for box in boxes:
x1, y1, x2, y2 = box[:4].astype(int)
score = box[-2]
label = int(box[-1])
clr = colors[label]
# draw the bounding box
img = cv2.rectangle(img, (x1, y1), (x2, y2), clr, box_thickness)
# text: <object class> (<confidence score in percent>%)
text = f'{class_names[label]} ({score*100:.0f}%)'
# get width (tw) and height (th) of the text
(tw, th), _ = cv2.getTextSize(text, font, font_scale, 1)
# background rectangle for the text
tb_x1 = x1 - box_thickness//2
tb_y1 = y1 - box_thickness//2 - th - 2*border
tb_x2 = x1 + tw + 2*border
tb_y2 = y1
# draw the background rectangle
img = cv2.rectangle(img, (tb_x1, tb_y1), (tb_x2, tb_y2), clr, -1)
# put the text
img = cv2.putText(img, text, (x1 + border, y1 - border), font, font_scale, text_color, text_weight, cv2.LINE_AA)
return img