https://www.osgeo.cn/pillow/reference/ImageDraw.html#PIL.ImageDraw.PIL.ImageDraw.ImageDraw.rectangle

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:Linda Li
@Time:2020/7/23 下午9:25
"""
# coding=utf-8
# cv2解决绘制中文乱码

import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont
#区别就是local是左上角的值,但是x是左上角和右下角的值
def Chinese_plot_box(image,label,x,sizes,colour=None,line_thickness=None):
    """x是xyxy坐标
    label="人"等汉字"""
    cv2img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    pilimg = Image.fromarray(cv2img)
    draw = ImageDraw.Draw(pilimg)  # 图片上打印
    font = ImageFont.truetype("font/YaqiHeiBold.ttf",sizes, encoding="utf-8")

    tl = line_thickness or round(0.002 * (image.shape[0] + image.shape[1]) / 2) + 1
    # 颜色随机
    # colour = colour or [random.randint(0, 255) for _ in range(3)]
    c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
    # 这个是大框
    draw.rectangle([int(x[0]), int(x[1]), int(x[2]), int(x[3])], outline=(255, 0, 0),
                   fill=None, width=tl)
    if label:
        print(label)
        tf = max(tl - 1, 1)  # font thickness  字体大小
        t_size = cv2.getTextSize(label, 0, fontScale=tl / 6, thickness=tf)[0]
        # 衬托字体的小矩形
        # ([xyxy],outline轮廓的颜色, fill用于填充的颜色)
        draw.rectangle([int(x[0]),int(x[1]),c1[0] + t_size[0],c1[1] - t_size[1] - 3], outline=(255,0,0),fill=(255,0,0),width=1)
        # cv2.rectangle(image, c1, c2, (0,255,0), -1)  # filled
        # 这个颜色必须是数组tuple(colour)
        draw.text(((int(x[0]), int(x[1])-23)), label, (255,255,255), font=font)
        image = cv2.cvtColor(numpy.array(pilimg), cv2.COLOR_RGB2BGR)
    return image

if __name__ == '__main__':
    im0 = cv2.imread('data/zhoujietu/dog.jpg')
    img = Chinese_plot_box(im0, label='动物', x=[523,719,641,823], sizes=20, colour=None, line_thickness=None)
    cv2.imshow('show', img)
    cv2.imwrite('output/3/dog1.jpg', img)
    if cv2.waitKey(100000) & 0xFF == ord('q'):
        cv2.destroyAllWindows()


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐