目标检测中,在对比自己算法的检测效果时,需要和标注的真实值进行对比。在网上找到的大部分功能是一样的,只不过不完全符合画出真实标注的训练图片。
import cv2
import numpy as np
import xml.dom.minidom
import os
import argparse
def main():
# JPG文件的地址
img_path = 'D:/code/yolov3-master/data/img/'
# XML文件的地址
anno_path = 'D:/code/yolov3-master/data/xml/'
# 存结果的文件夹
cut_path = 'D:/code/yolov3-master/data/yl/'
# 获取文件夹中的文件
imagelist = os.listdir(img_path)
for image in imagelist:
image_pre, ext = os.path.splitext(image)
img_file = img_path + image
# 读取图片
img = cv2.imread(img_file)
xml_file = anno_path + image_pre + '.xml'
# 打开xml文档
DOMTree = xml.dom.minidom.parse(xml_file)
# 得到文档元素对象
collection = DOMTree.documentElement
# 得到标签名为object的信息
objects = collection.getElementsByTagName("object")
for object in objects:
# print("start")
# 每个object中得到子标签名为name的信息
namelist = object.getElementsByTagName('name')
# 通过此语句得到具体的某个name的值
objectname = namelist[0].childNodes[0].data
bndbox = object.getElementsByTagName('bndbox')[0]
xmin = bndbox.getElementsByTagName('xmin')[0]
xmin_data = xmin.childNodes[0].data
ymin = bndbox.getElementsByTagName('ymin')[0]
ymin_data = ymin.childNodes[0].data
xmax = bndbox.getElementsByTagName('xmax')[0]
xmax_data = xmax.childNodes[0].data
ymax = bndbox.getElementsByTagName('ymax')[0]
ymax_data = ymax.childNodes[0].data
xmin = int(xmin_data)
xmax = int(xmax_data)
ymin = int(ymin_data)
ymax = int(ymax_data)
# img_cut = img[ymin:ymax, xmin:xmax, :] # 截取框住的目标
# cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img)
cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), thickness=2) # 生成原始值
cv2.putText(img, objectname, (xmin, ymin), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 0), thickness=2)
cv2.imwrite(cut_path + '{}.jpg'.format(image_pre), img)
if __name__ == '__main__':
main()
参考文章
https://blog.csdn.net/weixin_43778744/article/details/104229713
https://blog.csdn.net/qq_40279508/article/details/81204989