python实现------标好的xml的框和文字,画到原图上面

把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
# warnings.filterwarnings("ignore")


def GetObjectsFromXml(xml_path):
    '''
    从XML文件获取指定类别目标:
    ClassNames——类别名称list
    xml_path——xml文件路径
    返回一个list类型的目标集合
    '''
    ObjectDict={
    
    }
    # 修改将xml标注文件中对于类别的索引<type>改为VOC数据集适配的<name>
    # cname2cid = get_class_names(CLASSES_NAMES)
    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('type').text#点我科技标注后此项为type,VOC数据集为name
        cname = obj.find('name').text
        box_name.append(cname)
        # if not (cname in ClassNames):continue
        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)
        # color=tuple(color.astype(np.uint8).tolist())
        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)
    # cv2.namedWindow("img")
    print(img.shape)
    # img1=cv2.resize(img,(4000,512))
    # print(img1.shape)
    # cv2.imshow("img",img)
    # cv2.waitKey(0)
    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)
    # img2=draw_detections_pil(box_xyxy,box_name,img)
    # img2.save(r"F:\Desktop\mytest\a.jpg")

猜你喜欢

转载自blog.csdn.net/m0_47405013/article/details/130037313
今日推荐