代码是参考的多方资源,并非所有都是原创,如有侵权行为,请及时告知。
编译环境
- python 3.6
- opencv-python
- 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框的数量,可以把# 读取框图下面的三行注释代码取消注释。
结果展示
如果本文给您带来方便的话,请持续关注我,会不定期的推送文章。