第一步 读取所有txt文件名
txtlist = []
for home, dirs,files in os.walk(txtpath):
for filename in files:
if os.path.splitext(filename)[0][-1] == '1':
txtlist.append(os.path.join(home,filename))
此时要注意,python读取并不是按照顺序读取,想要正确画框需要对文件排序
txtlist.sort(key=lambda x:int(x.split('_')[-2]))
这里具体的切割方式与排序value取决自己的实际需求,分别改动split中的字符与[-2]中的数字
读取图片同理,不再赘述
第二步 txt文件按行读取后,取出str值并转为list
按行读取数据
f = open(txtlist[count],'r')
lines = f.readlines()
此时lines类型为list,目标追踪生成的txt文件每行结尾都有换行符,需要去掉。
lines[num] = lines[num].strip('\n')
此时lines[num]是一个string类型的数据,想要转成list就改变变量
同时也要注意txt给出的标注信息格式,例如本题中给出的格式为
<bb_xmin>, <bb_ymin>, <bb_width>, <bb_height>
但是PIL的画框参数要求为左上角坐标与右下角坐标
因此需要进行坐标转换,
<bb_xmin>, <bb_ymin>, <bb_xmin>+<bb_width>, <bb_ymin>+<bb_height>
l = lines[num].split(',')
l = list(map(float, l))
t = [l[0],l[1],l[0]+l[2],l[1]+l[3]]
第三步 绘制图片
from PIL import ImageDraw
from PIL import Image
image = Image.open(images[num])
draw = ImageDraw.Draw(image)
draw.rectangle(t,outline=(255,0,0))
image.save(dir + '/' + images[num].split('/')[-1])
对保存路径若无则创建文件夹
if not os.path.exists(dir):
os.makedirs(dir)
最后 搞一个好看的进度条
from alive_progress import alive_bar
items = range(1000)
with alive_bar(len(items) as bar:
for item in items:
bar()