一,创建可视化脚本
cd /home/dxf/BAT-main
# 使用文本编辑器创建脚本
nano visualize_tracking.py
将下面的可视化Python代码复制粘贴进去,然后按 Ctrl+X,按 Y,按 Enter 保存。(我的代码由ai生成,可以根据需要再重新生成一份)
import os
import cv2
import numpy as np
from pathlib import Path
import argparse
def load_tracking_results(result_path):
"""
加载跟踪结果文件
每一行格式: x, y, width, height
"""
with open(result_path, 'r') as f:
lines = f.readlines()
boxes = []
for line in lines:
# 解析每一行的坐标
values = line.strip().split()
if len(values) >= 4:
x, y, w, h = map(float, values[:4])
boxes.append([x, y, w, h])
return boxes
def visualize_sequence(dataset_root, sequence_name, result_path, output_dir, modality='visible'):
"""
可视化单个视频序列的跟踪结果
Args:
dataset_root: RGBT234数据集根目录
sequence_name: 视频序列名称 (如 'afterrain')
result_path: 跟踪结果文件路径
output_dir: 输出视频保存目录
modality: 'visible' 或 'infrared'
"""
# 构建图像序列路径
if modality == 'visible':
img_dir = os.path.join(dataset_root, sequence_name, 'visible')
else:
img_dir = os.path.join(dataset_root, sequence_name, 'infrared')
# 获取所有图像文件
img_files = sorted([f for f in os.listdir(img_dir) if f.endswith(('.jpg', '.png', '.bmp'))])
if len(img_files) == 0:
print(f"❌ 没有找到图像文件: {img_dir}")
return
# 加载跟踪结果
tracking_boxes = load_tracking_results(result_path)
print(f"📊 序列: {sequence_name}")
print(f" - 图像数量: {len(img_files)}")
print(f" - 跟踪框数量: {len(tracking_boxes)}")
# 读取第一帧以获取视频尺寸
first_img = cv2.imread(os.path.join(img_dir, img_files[0]))
height, width = first_img.shape[:2]
# 创建输出视频
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, f"{sequence_name}_{modality}.avi")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter(output_path, fourcc, 20.0, (width, height))
# 逐帧绘制跟踪框
for idx, img_file in enumerate(img_files):
# 读取图像
img_path = os.path.join(img_dir, img_file)
frame = cv2.imread(img_path)
if frame is None:
print(f"⚠️ 无法读取图像: {img_path}")
continue
# 绘制跟踪框(如果有对应的框)
if idx < len(tracking_boxes):
x, y, w, h = tracking_boxes[idx]
# 转换为整数坐标
x, y, w, h = int(x), int(y), int(w), int(h)
# 绘制矩形框(绿色,线宽2)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 添加帧号文本
cv2.putText(frame, f"Frame: {idx+1}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 写入视频
video_writer.write(frame)
# 显示进度
if (idx + 1) % 50 == 0:
print(f" 处理进度: {idx+1}/{len(img_files)}")
video_writer.release()
print(f"✅ 视频已保存: {output_path}\n")
def visualize_all_sequences(dataset_root, results_root, output_dir, modality='visible'):
"""
批量可视化所有序列
"""
results_dir = os.path.join(results_root, 'RGBT234', 'rgbt')
if not os.path.exists(results_dir):
print(f"❌ 结果目录不存在: {results_dir}")
return
# 获取所有结果文件
result_files = [f for f in os.listdir(results_dir) if f.endswith('.txt')]
print(f"🎯 找到 {len(result_files)} 个跟踪结果文件\n")
for result_file in result_files:
sequence_name = result_file.replace('.txt', '')
result_path = os.path.join(results_dir, result_file)
try:
visualize_sequence(dataset_root, sequence_name, result_path,
output_dir, modality)
except Exception as e:
print(f"❌ 处理 {sequence_name} 时出错: {str(e)}\n")
def main():
parser = argparse.ArgumentParser(description='可视化RGBT234跟踪结果')
parser.add_argument('--dataset', type=str, required=True,
help='RGBT234数据集根目录')
parser.add_argument('--results', type=str, required=True,
help='跟踪结果根目录')
parser.add_argument('--output', type=str, default='./visualizations',
help='输出视频保存目录')
parser.add_argument('--modality', type=str, default='visible',
choices=['visible', 'infrared'],
help='可视化模态: visible(可见光) 或 infrared(热红外)')
parser.add_argument('--sequence', type=str, default=None,
help='指定单个序列名称(可选,不指定则处理所有序列)')
args = parser.parse_args()
print("="*60)
print("🎬 RGBT234 跟踪结果可视化工具")
print("="*60)
print(f"数据集路径: {args.dataset}")
print(f"结果路径: {args.results}")
print(f"输出路径: {args.output}")
print(f"可视化模态: {args.modality}")
print("="*60 + "\n")
if args.sequence:
# 可视化单个序列
result_path = os.path.join(args.results, 'RGBT234', 'rgbt', f'{args.sequence}.txt')
visualize_sequence(args.dataset, args.sequence, result_path,
args.output, args.modality)
else:
# 批量可视化所有序列
visualize_all_sequences(args.dataset, args.results,
args.output, args.modality)
print("="*60)
print("✨ 可视化完成!")
print("="*60)
if __name__ == '__main__':
main()
或者直接在pycharm中手动创建文件,但是我将该代码复制粘贴不到该python文件中,是通过手动打开本地文件进行粘贴上去的。
另外,在创建这个python文件时,我是现在终端上进行创建,没有在pycham上发现该文件,而且我发现我不太会用复制粘贴的指令,于是在pycharm上进行创建,两边都创建了文件,我怕冲突,就删除了pycharm上创建的文件,准备再删除终端上创建的文件,用这个指令:
# 进入文件所在目录
cd /home/dxf/BAT-main
# 删除文件
rm visualize_tracking.py
没找到该文件,可能就没创建成功。
二,确认路径结构
首先确定你的数据集和结果路径
# 查看RGBT234数据集结构(应该在Pudata下)
ls /home/Pudata/RGBT234/
# 查看跟踪结果
ls /home/dxf/BAT-main/RGBT_workspace/results/RGBT234/rgbt/
RGBT234的典型结构应该是:
RGBT234/
├── afterrain/
│ ├── visible/
│ │ ├── 00001.jpg
│ │ ├── 00002.jpg
│ │ └── ...
│ └── infrared/
│ ├── 00001.jpg
│ └── ...
├── aftertree/
└── ...
本文结构:


afterrain/
├── visible/ # 可见光图像文件夹 ✅
├── infrared/ # 热红外图像文件夹 ✅
├── visible.txt # Ground Truth标注文件
├── infrared.txt # Ground Truth标注文件
└── 其他.tag文件 # 属性标签文件


三,运行可视化脚本
方法1:可视化单个序列(快速测试)
# 激活conda环境
conda activate py37
# 可视化单个视频(如afterrain)
python visualize_tracking.py \
--dataset /home/Pudata/RGBT234 \
--results /home/dxf/BAT-main/RGBT_workspace/results \
--output ./visualizations \
--modality visible \
--sequence afterrain
我只进行了单个序列的可视化。另外,我在逐行分别输入命令 ,但是每行的 \ 后面按了回车键,导致bash认为这些是独立的参数而不是一个完整的命令。(我是直接复制粘贴指令上去的)
可以通过把参数全写在一行上面:
python visualize_tracking.py --dataset /home/Pudata/RGBT234 --results /home/dxf/BAT-main/RGBT_workspace/results --output ./visualizations --modality visible --sequence afterrain
运行结果:

方法2:批量可视化所有序列
# 处理所有测试序列(可见光模态)
python visualize_tracking.py \
--dataset /home/Pudata/RGBT234 \
--results /home/dxf/BAT-main/RGBT_workspace/results \
--output ./visualizations \
--modality visible
方法3:可视化热红外模态
python visualize_tracking.py \
--dataset /home/Pudata/RGBT234 \
--results /home/dxf/BAT-main/RGBT_workspace/results \
--output ./visualizations \
--modality infrared \
--sequence afterrain
四,查看生成的视频
# 查看生成的视频文件
ls -lh /home/dxf/BAT-main/visualizations/
# 使用Linux自带的视频播放器观看
vlc /home/dxf/BAT-main/visualizations/afterrain_visible.avi
# 或
totem /home/dxf/BAT-main/visualizations/afterrain_visible.avi
运行结果:

可视化脚本运行非常成功,已经得到了 afterrain_visible.avi 视频文件。
出现 bash: vlc: 未找到命令 是因为我的 Linux 系统中没有安装 VLC 播放器。
直接打开图形化界面,在桌面环境下操作:打开"文件管理器"(类似 Windows 的文件夹)。
- 导航到目录:
/home/dxf/BAT-main/visualizations/。 - 你应该能看到
afterrain_visible.avi这个文件。 - 直接双击它,系统会调用自带的默认播放器打开它。(我是直接在系统提示下安装了一个小插件,然后得到了最终的视频)


第一个序列是包含123帧的视频。
五,(可选)生成对比视频
如果你想同时看到可见光和热红外的跟踪效果,可以创建一个并排对比的脚本:
nano visualize_comparison.py
添加以下代码:
import cv2
import numpy as np
import os
def create_comparison_video(seq_name, vis_video_path, ir_video_path, output_path):
"""创建左右并排对比视频"""
# 打开两个视频
vis_cap = cv2.VideoCapture(vis_video_path)
ir_cap = cv2.VideoCapture(ir_video_path)
# 获取视频属性
fps = int(vis_cap.get(cv2.CAP_PROP_FPS))
width = int(vis_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(vis_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建输出视频(宽度是原来的2倍)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (width * 2, height))
print(f"🎥 生成对比视频: {seq_name}")
frame_idx = 0
while True:
ret1, vis_frame = vis_cap.read()
ret2, ir_frame = ir_cap.read()
if not ret1 or not ret2:
break
# 在可见光帧上添加标签
cv2.putText(vis_frame, "Visible", (10, height - 20),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 在热红外帧上添加标签
cv2.putText(ir_frame, "Infrared", (10, height - 20),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 水平拼接两个帧
combined = np.hstack((vis_frame, ir_frame))
# 写入输出视频
out.write(combined)
frame_idx += 1
if frame_idx % 50 == 0:
print(f" 处理帧: {frame_idx}")
vis_cap.release()
ir_cap.release()
out.release()
print(f"✅ 对比视频已保存: {output_path}\n")
if __name__ == '__main__':
# 配置路径
vis_dir = './visualizations'
output_dir = './visualizations/comparisons'
os.makedirs(output_dir, exist_ok=True)
# 获取所有可见光视频
vis_videos = [f for f in os.listdir(vis_dir) if f.endswith('_visible.avi')]
for vis_video in vis_videos:
seq_name = vis_video.replace('_visible.avi', '')
ir_video = f'{seq_name}_infrared.avi'
vis_path = os.path.join(vis_dir, vis_video)
ir_path = os.path.join(vis_dir, ir_video)
if os.path.exists(ir_path):
output_path = os.path.join(output_dir, f'{seq_name}_comparison.avi')
create_comparison_video(seq_name, vis_path, ir_path, output_path)
print("✨ 所有对比视频生成完成!")
运行对比脚本:
python visualize_comparison.py
如果有很多序列需要处理,可以只处理几个代表性的:
# 只处理3个序列
for seq in afterrain aftertree baby; do
python visualize_tracking.py \
--dataset /home/Pudata/RGBT234 \
--results /home/dxf/BAT-main/RGBT_workspace/results \
--output ./visualizations \
--sequence $seq
done