PIL与opencv绘制bounding box(带文本标签)的比较

在目标检测领域,经常需要用到矩形框来显示检测到的目标,常用的绘制工具包括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格式的字体就可以导入。两类绘制方法,代码量相差无几。

画个图我还要吃狗粮!!!!!!!!!!!!!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值