今天想输出一下图片的标注信息,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)#写文字,参数为文字添加位置,添加的文字字符串,文字颜色,格式