基于无人机数据逐帧计算行人车辆距离的Python/Matlab代码实现方法
Python实现逐帧行人和车辆距离计算方案
核心思路
利用pandas的表关联功能自动完成同帧下所有行人和车辆的配对,再通过向量化运算批量计算距离,比手动写for循环效率高10倍以上,完全适配你的数据量。
前置准备
假设你已经将行人数据、车辆数据读取为pandas DataFrame,分别命名为peds_df、vehs_df,先对重复的列名重命名避免冲突:
import pandas as pd import numpy as np # 重命名列,避免合并后冲突 peds_df = peds_df.rename(columns={ 'id': 'ped_id', 'x_est': 'ped_x', 'y_est': 'ped_y', 'v_abs': 'ped_speed' }) vehs_df = vehs_df.rename(columns={ 'id': 'veh_id', 'x_est': 'veh_x', 'y_est': 'veh_y', 'vel_est': 'veh_speed' })
核心实现代码
# 按帧号关联,同帧下所有行人和车辆会自动配对 merged_df = pd.merge(peds_df, vehs_df, on='frame', how='inner') # 批量计算距离 merged_df['distance'] = np.sqrt( (merged_df['ped_x'] - merged_df['veh_x'])**2 + (merged_df['ped_y'] - merged_df['veh_y'])**2 ) # 提取你需要的三列,也可保留frame、ped_id、veh_id等字段按需筛选 result_df = merged_df[['distance', 'ped_speed', 'veh_speed']] # 可选:导出结果为csv result_df.to_csv('ped_veh_distance.csv', index=False)
原代码问题说明
你原来的写法是直接对两个不同长度的DataFrame做相等判断和运算,维度不匹配必然报错。上述方案不需要手动写for循环遍历每帧,pandas的关联操作已经自动完成了同帧配对,向量化运算也比嵌套for循环效率高很多,即使你全量116帧的数据也可以在毫秒级完成计算。
可选:逐帧for循环实现(不推荐,效率低)
如果一定要按你计划的用for循环逐帧处理,参考代码如下:
result = [] # 遍历所有唯一帧号 for frame in peds_df['frame'].unique(): # 取当前帧的行人和车辆 frame_peds = peds_df[peds_df['frame'] == frame] frame_vehs = vehs_df[vehs_df['frame'] == frame] # 遍历当前帧所有行人和车辆配对 for _, ped in frame_peds.iterrows(): for _, veh in frame_vehs.iterrows(): dist = np.sqrt((ped['ped_x'] - veh['veh_x'])**2 + (ped['ped_y'] - veh['veh_y'])**2) result.append([dist, ped['ped_speed'], veh['veh_speed']]) result_df = pd.DataFrame(result, columns=['distance', 'ped_speed', 'veh_speed'])
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

