# -*- coding: utf-8 -*- """ Created on Tue May 21 15:25:23 2024 @author: ieemoo-zl003 """ import os import numpy as np # 替换为你的目录路径 files_path = 'D:/Project/ieemoo/kmeans/comparisonData/deletedBarcode_10_0709_am/err_pair/6902088146356/20240709-105804_6902088146356' def str_to_float_arr(s): # 移除字符串末尾的逗号(如果存在) if s.endswith(','): s = s[:-1] # 使用split()方法分割字符串,然后将每个元素转化为float float_array = [float(x) for x in s.split(",")] return float_array def extract_tracker_input_boxes_feats(file_name): framesId = [] boxes = [] feats = [] frame_id = 0 with open(file_name, 'r', encoding='utf-8') as file: for line in file: line = line.strip() # 去除行尾的换行符和可能的空白字符 # 跳过空行 if not line: continue if line.find("frameId") >= 0: frame_id = line[line.find("frameId:") + 8:].strip() # 检查是否以'box:'或'feat:'开始 if line.find("box:") >= 0 and line.find("output_box:") < 0: boxes.append(line[line.find("box:") + 4:].strip()) # 去掉'box:'并去除可能的空白字符 framesId.append(frame_id) if line.find("feat:") >= 0: feats.append(line[line.find("feat:") + 5:].strip()) # 去掉'box:'并去除可能的空白字符 return boxes, feats, framesId def find_string_in_array(arr, target): """ 在字符串数组中找到目标字符串对应的行(索引)。 参数: arr -- 字符串数组 target -- 要查找的目标字符串 返回: 目标字符串在数组中的索引。如果未找到,则返回-1。 """ parts = target.split(',') box_substrings = ','.join(parts[:4]) conf_substring = ','.join(parts[5:6]) for i, s in enumerate(arr): if s.find(box_substrings) >= 0 and s.find(conf_substring[:7]) >= 0: return i return -1 def extract_tracker_output_boxes_feats(read_file_name): input_boxes, input_feats, framesId = extract_tracker_input_boxes_feats(read_file_name) boxes = [] feats = [] with open(read_file_name, 'r', encoding='utf-8') as file: for line in file: line = line.strip() # 去除行尾的换行符和可能的空白字符 # 跳过空行 if not line: continue # 检查是否以'output_box:'开始 if line.find("output_box:") >= 0: boxes_str = line[line.find("output_box:") + 11:].strip() boxes.append(boxes_str) # 去掉'output_box:'并去除可能的空白字符 index = find_string_in_array(input_boxes, boxes_str) feat_f = str_to_float_arr(input_feats[index]) norm_f = np.linalg.norm(feat_f) feat_f = feat_f / norm_f feats.append(feat_f) return input_boxes, input_feats, boxes, feats, framesId def extract_tracking_output_boxes_feats(read_file_name): tracker_boxes, tracker_feats, input_boxes, input_feats, framesId = extract_tracker_output_boxes_feats( read_file_name) boxes = [] feats = [] boxes_frames_id = [] tracking_flag = False tracking_num_cnt = 0 with open(read_file_name, 'r', encoding='utf-8') as file: for line in file: line = line.strip() # 去除行尾的换行符和可能的空白字符 # 跳过空行 if not line: continue if tracking_flag: if line.find("tracking_") >= 0: tracking_flag = False tracking_num_cnt = tracking_num_cnt + 1 else: boxes.append(line) index = find_string_in_array(input_boxes, line) feats.append(input_feats[index]) if tracking_num_cnt == 0: index = find_string_in_array(tracker_boxes, line) boxes_frames_id.append(framesId[index]) # 检查是否以tracking_'开始 if line.find("tracking_") >= 0: tracking_flag = True return tracker_boxes, tracker_feats, input_boxes, input_feats, boxes, feats, boxes_frames_id def find_index_feats(files_path): # 遍历目录下的所有文件和目录 all_boxes, boboxes_frames_ids, Boxes, framesIds =[],[],[],[] for filename in os.listdir(files_path): # 构造完整的文件路径 file_path = os.path.join(files_path, filename) # 判断是否是文件 if os.path.isfile(file_path): # 打开文件 if filename.endswith('data') and (not 'tracking' in filename): tracker_boxes, tracker_feats, input_boxes, input_feats, boxes, feats, boxes_frames_id = extract_tracking_output_boxes_feats(file_path) box, feats, framesId = extract_tracker_input_boxes_feats(file_path) Boxes += box framesIds += framesId all_boxes += boxes[:len(boxes_frames_id)] boboxes_frames_ids += boxes_frames_id # print(all_boxes) # print(boboxes_frames_ids) return all_boxes, boboxes_frames_ids, tracker_boxes, Boxes, framesIds if __name__ == '__main__': find_index_feats(files_path)