python opencv PIL 图片画框,加文字

今天想输出一下图片的标注信息,box和label

注!opencv的路径下不能有中文!!! 读取图片时,返回的是None!!


import os
import cv2
import numpy as np
import  xml.dom.minidom
import pandas as pd
from PIL import Image, ImageDraw, ImageFont


input_file="F:/dataset/label/"  
dirs_name=os.listdir("F:/wrong/")  #图片地址

font=cv2.FONT_HERSHEY_SIMPLEX
for img in dirs_name:
    
    im=cv2.imread("F:/wrong/"+img)  #读取图片
    dom=xml.dom.minidom.parse(input_file+img[:-4]+".xml") # 读取图片对应的label信息 xml文件
    root=dom.documentElement
    
    objs=root.getElementsByTagName("object")

    name=[]
    xmin=[]
    ymin=[]
    xmax=[]
    ymax=[]

    for obj in objs:
        
        name1=obj.getElementsByTagName('name')
        n=name1[0].firstChild.data
        xmin1=obj.getElementsByTagName('xmin')
        xi=xmin1[0].firstChild.data
        ymin1=obj.getElementsByTagName('ymin')
        yi=ymin1[0].firstChild.data
        xmax1=obj.getElementsByTagName('xmax')
        xa=xmax1[0].firstChild.data
        ymax1=obj.getElementsByTagName('ymax')
        ya=ymax1[0].firstChild.data

        xmin.append(int(xi.strip()))
        print(xmin)
        ymin.append(int(yi.strip()))
        xmax.append(int(xa.strip()))
        ymax.append(int(ya.strip()))
        name.append(n.strip())
        
    for i in range(0,len(xmin)):
       

        #画box
        cv2.rectangle(im, (xmin[i],ymin[i]), (xmax[i],ymax[i]), (0,255,0), 4)
    
    cv2img = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
    pilimg = Image.fromarray(cv2img)
    draw = ImageDraw.Draw(pilimg)
    # 写标注
    for i in range(0,len(xmin)):
        font = ImageFont.truetype("simhei.ttf", 40, encoding="utf-8")
        draw.text((xmin[i], ymin[i]-40), name[i], (255, 0, 0), font=font)
    
    cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
    
    #保存图片
    cv2.imwrite("F:/show/"+img,cv2charimg)

由于opencv想要在图片中添加中文文字需要下载专门的中文字体包,为了避免麻烦,使用PIL添加中文字,就需要多添加几个步骤。

opencv打开图片的格式是BGR,而PIL是RGB,首先需要转换,

cv2img = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
pilimg = Image.fromarray(cv2img)

然后使用PIL中的ImageDraw写中文文字

draw = ImageDraw.Draw(pilimg)
font = ImageFont.truetype("simhei.ttf", 40, encoding="utf-8")#格式,参数分别为 字体文件,文字大小,编码方式
draw.text((xmin[i], ymin[i]-40), name[i], (255, 0, 0), font=font)#写文字,参数为文字添加位置,添加的文字字符串,文字颜色,格式

猜你喜欢

转载自blog.csdn.net/qq_32799915/article/details/81111423