如何将多边形文本数据转换为[num_boxes,4,2]形状的NumPy数组?
将多边形坐标转换为规范边界框数组的NumPy实现
我有一个文本文件,每行以x1,y1,x2,y2,x3,y3,x4,y4的格式定义一个多边形,数据行重复排列。希望将这些数据读入NumPy数组,最终形状为[num_boxes,4,2],其中每个框的结构是[[x_min,y_min],[x_min,y_max],[x_max,y_max],[x_max,y_min]](x_min/x_max为该多边形所有x坐标的最小/最大值,y_min/y_max同理)。
我已经通过以下代码读取数据并计算出极值:
boxes_x = np.loadtxt(label_path,usecols=np.arange(0,8,2),dtype=int,delimiter=",") boxes_y = np.loadtxt(label_path,usecols=np.arange(1,8,2),dtype=int,delimiter=",") x_max = boxes_x[:].max(axis=1) y_max = boxes_y[:].max(axis=1) x_min = boxes_x[:].min(axis=1) y_min = boxes_y[:].min(axis=1)
但不知道如何将这些极值数据重塑为目标形状[num_boxes,4,2],求最佳实现方式。
解决方案
基于你已经算出的极值数组,最直接的方式是构造每个边界框的四个顶点,再组合成目标形状:
方法1:基于现有极值数组构造
# 将一维的极值数组组合成二维的顶点坐标(每个顶点是[x,y]) top_left = np.stack([x_min, y_min], axis=1) # 形状:[num_boxes, 2] top_right = np.stack([x_min, y_max], axis=1) bottom_right = np.stack([x_max, y_max], axis=1) bottom_left = np.stack([x_max, y_min], axis=1) # 将四个顶点沿第1维度堆叠,得到目标形状[num_boxes,4,2] boxes = np.stack([top_left, top_right, bottom_right, bottom_left], axis=1)
方法2:优化读取流程(更高效)
可以一次性读取所有坐标,避免两次调用np.loadtxt,再统一计算极值:
# 一次性读取所有行,形状为[num_boxes, 8] all_coords = np.loadtxt(label_path, dtype=int, delimiter=",") # 重塑为每个多边形的四个点坐标,形状[num_boxes,4,2] points = all_coords.reshape(-1, 4, 2) # 计算每个多边形的x/y极值(axis=1表示在四个点的维度上取最值) x_min = points[..., 0].min(axis=1) x_max = points[..., 0].max(axis=1) y_min = points[..., 1].min(axis=1) y_max = points[..., 1].max(axis=1) # 同样构造目标数组 boxes = np.stack([ np.stack([x_min, y_min], axis=1), np.stack([x_min, y_max], axis=1), np.stack([x_max, y_max], axis=1), np.stack([x_max, y_min], axis=1) ], axis=1)
说明
np.stack(axis=1)会将两个一维数组(如x_min和y_min)按列组合成二维的顶点数组;- 最后一次
np.stack(axis=1)会将四个顶点数组沿第1维度堆叠,正好得到[num_boxes,4,2]的目标形状,每个元素对应一个边界框的四个顶点。
内容的提问来源于stack exchange,提问作者abinitio
相关产品推荐
相关产品推荐

