在目标检测领域,经常需要用到矩形框来显示检测到的目标,常用的绘制工具包括PIL库和Opencv库。
首先弄清楚图片的坐标系:
图形左上角为原点,纵轴为Y轴,横轴为X轴。
原始图片:
PIL绘制bbox:
以下用到的字体,请点击此处自行下载ttf文件。
from PIL import Image, ImageDraw, ImageFont
import numpy as np
def pil_draw(img_path):
# 1.读取图片
im = Image.open(img_path)
# 2.获取边框坐标
# 边框格式 bbox = [xl, yl, xr, yr]
bbox1 = [72, 41, 208, 330]
label1 = 'man'
bbox2 = [100, 80, 248, 334]
label2 = 'woman'
# 设置字体格式及大小
font = ImageFont.truetype(font='./Gemelli.ttf', size=np.floor(1.5e-2 * np.shape(im)[1] + 15).astype('int32'))
draw = ImageDraw.Draw(im)
# 获取label长宽
label_size1 = draw.textsize(label1, font)
label_size2 = draw.textsize(label2, font)
# 设置label起点
text_origin1 = np.array([bbox1[0], bbox1[1] - label_size1[1]])
text_origin2 = np.array([bbox2[0], bbox2[1] - label_size2[1]])
# 绘制矩形框,加入label文本
draw.rectangle([bbox1[0], bbox1[1], bbox1[2], bbox1[3]],outline='red',width=2)
draw.rectangle([tuple(text_origin1), tuple(text_origin1 + label_size1)], fill='red')
draw.text(text_origin1, str(label1), fill=(255, 255, 255), font=font)
draw.rectangle([bbox2[0], bbox2[1], bbox2[2], bbox2[3]],outline='green',width=2)
draw.rectangle([tuple(text_origin2), tuple(text_origin2 + label_size2)], fill='green')
draw.text(text_origin2, str(label2), fill=(255, 255, 255), font=font)
del draw
im.save("PIL_img.jpg")
pil_draw(img_path="107.jpg")
opencv绘制bbox:
import cv2
import numpy as np
def cv_draw(img_path):
# 1.读取图片
image = cv2.imread(img_path)
# 2.获取标签
# 边框格式 bbox = [xl, yl, xr, yr]
bbox1 = [72, 41, 208, 330]
label1 = 'man'
bbox2 = [100, 80, 248, 334]
label2 = 'woman'
# 设置字体格式及大小
font = cv2.FONT_HERSHEY_SIMPLEX
# 获取label长宽
label_size1 = cv2.getTextSize(label1, font, 1, 2)
label_size2 = cv2.getTextSize(label2, font, 1, 2)
# 设置label起点
text_origin1 = np.array([bbox1[0], bbox1[1] - label_size1[0][1]])
text_origin2 = np.array([bbox2[0], bbox2[1] - label_size2[0][1]])
cv2.rectangle(image, (bbox1[0], bbox1[1]), (bbox1[2], bbox1[3]),
color=(0,0,255), thickness = 2 )
cv2.rectangle(image, tuple(text_origin1), tuple(text_origin1 + label_size1[0]),
color=(0, 0, 255), thickness = -1) # thickness=-1 表示矩形框内颜色填充
# 1为字体缩放比例,2表示自体粗细
cv2.putText(image, label1, (bbox1[0], bbox1[1] - 5), font, 1, (255, 255, 255), 2)
cv2.rectangle(image, (bbox2[0], bbox2[1]), (bbox2[2], bbox2[3]),
color=(0, 255, 0), thickness= 2)
cv2.rectangle(image, tuple(text_origin2), tuple(text_origin2 + label_size2[0]),
color=(0, 255, 0), thickness=-1) # thickness=-1 表示矩形框内颜色填充
cv2.putText(image, label2, (bbox2[0], bbox2[1] - 5), font, 1, (255, 255, 255), 2)
cv2.imwrite('cv_drwn.jpg',image)
cv_draw(img_path = '107.jpg')
PIL字体更丰富,下载一些ttf格式的字体就可以导入。两类绘制方法,代码量相差无几。
画个图我还要吃狗粮!!!!!!!!!!!!!!!!!!!!!!!