用python将跟踪可视化结果导出。
结果如图:
视频结果:
anti_uav
代码中需要改地址的地方:
txt_name跟踪文本路径;
file_path_img原始图片路径;
save_path保存结果地址;
filename跟踪文本路径(同txt_name)
#需要改地址的地方:txt_name跟踪文本路径;file_path_img原始图片路径;save_path保存结果地址;filename跟踪文本路径(同txt_name)
import os
import numpy as np
import cv2
def sort_output(txt_path):
with open(txt_path, 'r') as f:
list = []
for line in f:
list.append(line.strip())
# with open(txt_path, "w") as f:
# for item in sorted(list, key=lambda x: int(float(str(x).split(',')[0]))):
# f.writelines(item)
# f.writelines('\n')
f.close()
def draw_mot(video_id):
txt_name = 'E:/otb_txt' + video_id + '.txt' # 索引txt跟踪文本路径 video是自动索引的目标文件名称如otb数据集中的bastetball
file_path_img = 'E:/otb_img' + video_id # 原始图片路径
# 自动生成新的文件夹来存储画了bbox的图片
save_path = 'E:/result_video'
if not os.path.exists(save_path + video_id):
os.makedirs(save_path + video_id)
print('The ' + video_id + ' have create!')
save_file_path = save_path + video_id
sort_output(txt_name) # 这是一个对txt文本结果排序的代码,key=frame,根据帧数排序
source_file = open(txt_name)
# 把frame存入列表img_names
file_names = os.listdir(file_path_img)
file_names.sort(key=lambda x:int(x.split('.bmp')[0]))
img_num = [fn for fn in file_names if fn.endswith(('.jpg', '.jpeg', '.png','.bmp'))]
im = cv2.imread(os.path.join(file_path_img, file_names[0]))
img_size = (im.shape[1], im.shape[0])
fps = 30 #调节视频帧数
video_dir = os.path.join(save_file_path, video_id + '.mp4')
video = cv2.VideoWriter(video_dir, cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, img_size) # mjpg-avi
source_file = open(txt_name)
for idx in img_num:
img = cv2.imread(os.path.join(file_path_img, idx))
# for i in range(img_num[idx]):
line = source_file.readline()
staff = line.split(',')
id = video_id
#id = staff[1]
#cls = staff[3]
box = staff[:]
# print(id, box)
# draw_bbox
try:
cv2.rectangle(img, (int(float(box[0])), int(float(box[1]))),
(int(float(box[0])) + int(float(box[2])), int(float(box[1])) + int(float(box[3]))),
(0, 255, 0), 2)
# put_text
#cv2.putText(img, str(int(id)) + ' ' + str(int(cls)), (int(float(box[0])), int(float(box[1]))),
#cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
cv2.putText(img, str(id), (int(float(box[0])), int(float(box[1]))),
cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
# 保存图片
cv2.imwrite(os.path.join(save_file_path, idx), img)
except:
cv2.putText(img,"no result" , (10,10),
cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255), 1)
# 保存图片
cv2.imwrite(os.path.join(save_file_path, idx), img)
video.write(img)
# 释放资源
video.release()
source_file.close()
if __name__ == '__main__':
filename = os.listdir('E:/otb_txt') #txt跟踪文本路径
#生成数据集下的文件夹名称如otb的basketball
for name in filename:
print('The video ' + name.split('.')[0] + ' begin!')
draw_mot(name.split('.')[0])
print('The video ' + name.split('.')[0] + ' Done!')