检测:根据xml文件在图片上绘制框图

目标检测:根据xml文件在图片上绘制框图


代码是参考的多方资源,并非所有都是原创,如有侵权行为,请及时告知。

编译环境

  1. python 3.6
  2. opencv-python
  3. xml
    我使用的是anaconda 在安装相应的程序时会自动配置相应的库。

文件结构

主要文件
1.origin_img:放置图片和xml文件
在这里插入图片描述
2.test:用于保存处理后的图片
3.show_img:主程序

代码解析

import cv2
import os
from xml.etree import ElementTree as ET
import random
import shutil


def read_(path):
    # 检测的类别需要修改,根据自己检测的类别名修改即可
    voc_name_list = ['hat']
    with open(r'./del.txt', 'w') as writer:
        root_dir = path
        dir_path = os.path.join(root_dir, "JPEGImages")
        xml_dir_path = os.path.join(root_dir, "Annotations")
        files = os.listdir(xml_dir_path)
        random.shuffle(files)
        for name in files:
            xml_file = os.path.join(xml_dir_path, name)
            tree = ET.parse(xml_file)
            root = tree.getroot()
            filename = root.find("filename").text
            writer.writelines(filename.split('.')[0] + ' ')
            image_file_path = os.path.join(dir_path, filename)
            writer.writelines(image_file_path)
            for obj in root.findall('object'):
                label = obj.find('name').text
                bbox = obj.find("bndbox")
                xmin = int(float(bbox.find("xmin").text))
                ymin = int(float(bbox.find("ymin").text))
                xmax = int(float(bbox.find("xmax").text))
                ymax = int(float(bbox.find("ymax").text))
                if xmin < 0:
                    xmin =0
                if ymin < 0:
                    ymin =0

                writer.writelines(" {},{},{},{},{}".format(xmin, ymin, xmax, ymax, voc_name_list.index(label)))
            writer.writelines('\n')

def draw_result(info_):
    if os.path.exists('./test'): shutil.rmtree('./test')
    if not os.path.exists('./test'):
        os.mkdir('./test')
    # 检测的类别需要修改,根据自己检测的类别名修改即可
    voc_name_list = ['hat']
    ii = 0
    bbox_nums = []
    for i in info_:
        ii += 1
        x = i.split(' ')
        img = cv2.imread(x[1], 1)
        for j in range(len(x[2:])):
            bbox_ = x[j+2]
            bbox = bbox_.split(',')[:-1]
            bbox_nums.append(bbox)
            # 读取框图
            # print("-"*30)
            # print(len(bbox_nums))
            # print("-"*30)
            x1 = int(bbox[0])
            y1 = int(bbox[1])
            x2 = int(bbox[2])
            y2 = int(bbox[3])
            labels = bbox_.split(',')[-1]
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
            lineType = cv2.LINE_AA if cv2.__version__ > '3' else cv2.CV_AA
            cv2.putText(
                img, '%s' % voc_name_list[int(float(labels))],
                (x1, y1), cv2.FONT_HERSHEY_TRIPLEX, 0.8,
                (0, 255, 0), 2, 8)
        if img is None:
            print(x[0])
        cv2.imwrite('test/{}.jpg'.format(x[0]), img)


if __name__ == '__main__':
    # 存放img和xml的文件夹
    path = './origin_img/'
    read_(path)

    with open(r'./del.txt', 'r') as writer:
        txt = writer.readlines()
    txt1 = []
    for x in txt:
        if x == '\n':
            continue
        else:
            txt1.append(x.strip())
    draw_result(txt1)

(1) 只需要修改代码中的voc_name_list即可。
(2) 如果想要统计图片中的GT框的数量,可以把# 读取框图下面的三行注释代码取消注释。

结果展示

在这里插入图片描述
在这里插入图片描述如果本文给您带来方便的话,请持续关注我,会不定期的推送文章。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆珝

您的打赏是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值