把xml标好的框和文字,画到原图上面
import os
import cv2
import xml.etree.ElementTree as ET
from PIL import Image,ImageFont,ImageDraw
import random
import numpy as np
import warnings
def GetObjectsFromXml(xml_path):
'''
从XML文件获取指定类别目标:
ClassNames——类别名称list
xml_path——xml文件路径
返回一个list类型的目标集合
'''
ObjectDict={
}
box_name=[]
box_xyxy=[]
tree_org = ET.parse(xml_path)
ObjectDict['filename'] = tree_org.find("filename").text
ObjectDict['width'] = tree_org.find('size').find('width').text
ObjectDict['height'] = tree_org.find('size').find('height').text
ObjectDict['object']=[]
objs = tree_org.findall('object')
for i, obj in enumerate(objs):
cname = obj.find('name').text
box_name.append(cname)
objdict={
}
objdict["name"]=cname
objdict["difficult"] = obj.find('difficult').text
objdict["bndbox"]={
"xmin":obj.find('bndbox').find('xmin').text,
"ymin":obj.find('bndbox').find('ymin').text,
"xmax":obj.find('bndbox').find('xmax').text,
"ymax":obj.find('bndbox').find('ymax').text
}
box_xyxy.append([int(obj.find('bndbox').find('xmin').text),int(obj.find('bndbox').find('ymin').text),int(obj.find('bndbox').find('xmax').text),int(obj.find('bndbox').find('ymax').text)])
ObjectDict['object'].append(objdict)
return ObjectDict,box_name,box_xyxy
def draw_detections(boxes,names,img):
print("boxes:",len(boxes))
print("names:",len(names))
colors = []
for j in range(0, len(names)):
a = random.randint(0, 255)
colors.append(a)
for box,color,name in zip(boxes,colors,names):
print(box)
print(name)
xmin, ymin, xmax, ymax = box[0],box[1],box[2],box[3]
print(xmin, ymin, xmax, ymax)
cv2.rectangle(img,(xmin, ymin),(xmax, ymax),color,2)
cv2.putText(img, name, (xmin, ymin - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2,lineType=cv2.LINE_AA)
return img
def draw_detections_pil(boxes,names,img1):
imgshow = Image.fromarray(img1)
draw = ImageDraw.Draw(imgshow)
print("boxes:", len(boxes))
print("names:", len(names))
for box, name in zip(boxes,names):
xmin, ymin, xmax, ymax = box[0],box[1],box[2],box[3]
print(xmin, ymin, xmax, ymax)
draw.rectangle([xmin, ymin,xmax, ymax],outline=(255,0,0), width=3)
font = ImageFont.truetype('Arial.Unicode.ttf', 20)
text = name
text_width, text_height = draw.textsize(text, font=font)
draw.text((xmin+5, ymin - text_height), text, font=font, fill=(255,0,0))
return imgshow
if __name__ == '__main__':
imgdir=r"F:\Desktop\mytest\12345.jpg"
xmldir=r"F:\Desktop\mytest\12345.xml"
img=cv2.imread(imgdir,0)
print(img.shape)
object,box_name,box_xyxy=GetObjectsFromXml(xmldir)
print(box_name)
print(box_xyxy)
img2=draw_detections(box_xyxy,box_name,img)
cv2.imwrite(r"F:\Desktop\mytest\c.jpg",img2)