Python中如何从PLY文件获取YOLO输出边界框对应(x,y)的z轴坐标
实现步骤及代码
首先确保YOLO输出的边界框坐标与PLY文件存储的x/y坐标处于同一坐标系下(已完成TOF相机与YOLO所用成像设备的配准标定),即可通过numpy布尔索引快速筛选边界框内点的z轴值,无需遍历全部点云,运行效率更高。
如果YOLO输出的边界框为(center_x, center_y, width, height)的中心点+宽高格式,先转换为左上、右下边界坐标:
# 中心点+宽高转左上右下边界框 x_min = center_x - width / 2 y_min = center_y - height / 2 x_max = center_x + width / 2 y_max = center_y + height / 2 yolo_bbox = [x_min, y_min, x_max, y_max]
如果YOLO直接输出(x_min, y_min, x_max, y_max)格式可跳过上述转换步骤,直接执行筛选:
# 生成筛选掩码:x在[x_min, x_max]区间,且y在[y_min, y_max]区间 mask = (coors[:, 0] >= yolo_bbox[0]) & (coors[:, 0] <= yolo_bbox[2]) & (coors[:, 1] >= yolo_bbox[1]) & (coors[:, 1] <= yolo_bbox[3]) # 提取符合条件的所有点的z轴坐标 z_values = coors[mask, 2]
可选深度统计计算
如果需要获得边界框范围内的整体深度特征,可直接对提取出的z_values做统计计算:
import numpy as np z_mean = z_values.mean() # 平均深度 z_median = np.median(z_values) # 中位深度,抗噪性优于平均值 z_min = z_values.min() # 最小深度 z_max = z_values.max() # 最大深度
注意事项
- 若TOF相机与YOLO所用成像设备未完成标定配准,会出现坐标不匹配的问题,导致筛选出的点不属于目标边界框范围。
- 可额外添加异常值过滤规则,比如排除深度为0或者超出设备量程的无效点:
mask = mask & (coors[:,2] > 最小有效深度) & (coors[:,2] < 最大有效深度)。 - 若PLY文件存储的是世界坐标系下的3D坐标,不要直接和2D像素坐标比对,需要先通过相机内参将2D边界框坐标投影到3D空间后再做匹配。
内容的提问来源于stack exchange,提问作者Sabbir Talukdar
相关产品推荐
相关产品推荐

