
本文详细介绍了如何使用NumPy库高效地在三维(3D)网格中的多个边界框内采样点。通过利用`np.mgrid`函数,我们可以简洁地生成指定步长内的坐标点,并为每个点分配相应的标签。教程涵盖了数据结构解析、核心采样逻辑以及处理多边界框的方法,并提供了完整的示例代码和关键注意事项,帮助读者优化3D空间点采样任务。
在处理三维空间数据时,我们经常需要在一个或多个定义好的边界框(bounding box)内部以特定步长采样离散点。例如,给定一组由8个角点定义的3D盒子,每个角点包含(x, y, z, label)四维坐标信息,我们的目标是生成每个盒子内部所有满足step_size间隔的(x, y, z)坐标点,并为这些点分配对应的标签。
假设我们有一个NumPy数组boxes,它包含了n个3D边界框的信息。每个边界框由其8个角点定义,每个角点是一个4D向量(x, y, z, label)。因此,boxes的形状通常为(num_boxes, 8, 4)。其中:
例如,一个边界框的数据结构可能如下所示:
boxes[0] = np.array([
[0.0, 0.0, 0.0, 1],
[2.0, 0.0, 0.0, 1],
[2.0, 3.0, 0.0, 1],
[0.0, 3.0, 0.0, 1],
[0.0, 0.0, 1.0, 1],
[2.0, 0.0, 1.0, 1],
[2.0, 3.0, 1.0, 1],
[0.0, 3.0, 1.0, 1]
])这里,label(例如示例中的1)对于同一个边界框的所有8个角点是保持一致的。
NumPy的np.mgrid函数是生成多维坐标网格的强大工具,它允许我们以类似于Python切片的方式定义每个维度的起始、结束和步长。这使得它非常适合用于在3D空间中进行规则采样。
宁志投票评选网站管理系统一套专为活动投票专题建站首选的信息网站管理系统,风格宽频页面十分大方,宁志网站管理系统是国内知名建站软件,它由技术人员开发好了的一种现成建站软件,主要为全国各地方自助建站提供方便。 特点:安全、稳定、美观、实用、易操作。NZCMS开发结构采用ASP+ACCESS/MSSQL开发,运行高效的运行性能以及良好的可维护性,在近几年来吸引了众多国内机关单位的使用与推动:由于有众多支
119
对于单个边界框,采样过程可以分解为以下步骤:
import numpy as np
def sample_points_in_single_box(box_coords, box_label, step_size):
"""
在单个3D边界框内以指定步长采样点。
参数:
box_coords (np.ndarray): 形状为(8, 3)的数组,表示边界框的8个(x,y,z)角点。
box_label (int/float): 边界框的标签。
step_size (float): 采样点的间隔距离。
返回:
np.ndarray: 形状为(N, 4)的数组,每行包含一个采样点的(x, y, z, label)。
"""
# 提取每个维度的最小值和最大值
min_x, min_y, min_z = np.min(box_coords, axis=0)
max_x, max_y, max_z = np.max(box_coords, axis=0)
# 使用np.mgrid生成坐标网格
# 注意:mgrid的步长参数是独占的,即不包含max值。
# 对于标签维度,我们只取box_label本身。
# label:label+1 确保mgrid只生成一个值,即box_label
sampled_grid = np.mgrid[
min_x : max_x : step_size,
min_y : max_y : step_size,
min_z : max_z : step_size,
box_label : box_label + 1 # 确保标签维度只包含一个值
]
# 将多维网格重塑为 (4, N) 然后转置为 (N, 4)
# 其中 N 是采样点的总数
sampled_points = sampled_grid.reshape(4, -1).T
return sampled_points
# 示例数据
# 假设一个简单的单位立方体,标签为7
example_box_raw = np.array([
[0., 0., 0., 7.],
[0., 0., 1., 7.],
[0., 1., 0., 7.],
[0., 1., 1., 7.],
[1., 0., 0., 7.],
[1., 0., 1., 7.],
[1., 1., 0., 7.],
[1., 1., 1., 7.]
])
example_box_coords = example_box_raw[:, :3] # 提取XYZ坐标
example_box_label = int(example_box_raw[0, 3]) # 提取标签
step_size = 0.6
sampled_data = sample_points_in_single_box(example_box_coords, example_box_label, step_size)
print("单个边界框采样结果:")
print(sampled_data)输出示例:
单个边界框采样结果: [[0. 0. 0. 7. ] [0. 0. 0.6 7. ] [0. 0.6 0. 7. ] [0. 0.6 0.6 7. ] [0.6 0. 0. 7. ] [0.6 0. 0.6 7. ] [0.6 0.6 0. 7. ] [0.6 0.6 0.6 7. ]]
当需要处理多个边界框时,我们可以遍历boxes数组,对每个边界框应用上述的采样逻辑,并将结果收集起来。
import numpy as np
def sample_points_in_multiple_boxes(boxes_data, step_size):
"""
在多个3D边界框内以指定步长采样点。
参数:
boxes_data (np.ndarray): 形状为(num_boxes, 8, 4)的数组,
每个元素包含一个边界框的8个(x,y,z,label)角点。
step_size (float): 采样点的间隔距离。
返回:
tuple: (sampled_points_xyz, sampled_labels)
sampled_points_xyz (np.ndarray): 形状为(N, 3)的数组,所有采样点的(x,y,z)坐标。
sampled_labels (np.ndarray): 形状为(N,)的数组,所有采样点的标签。
"""
all_sampled_points = []
all_sampled_labels = []
# 遍历每个边界框
for i in range(boxes_data.shape[0]):
current_box_raw = boxes_data[i]
# 提取当前边界框的XYZ坐标和标签
current_box_coords = current_box_raw[:, :3]
# 假设每个盒子的标签在其第一个角点的第四个维度
current_box_label = int(current_box_raw[0, 3])
# 提取每个维度的最小值和最大值
min_x, min_y, min_z = np.min(current_box_coords, axis=0)
max_x, max_y, max_z = np.max(current_box_coords, axis=0)
# 使用np.mgrid生成坐标网格
sampled_grid = np.mgrid[
min_x : max_x : step_size,
min_y : max_y : step_size,
min_z : max_z : step_size,
current_box_label : current_box_label + 1
]
# 重塑数据并分离XYZ和标签
points_with_labels = sampled_grid.reshape(4, -1).T
all_sampled_points.append(points_with_labels[:, :3])
all_sampled_labels.append(points_with_labels[:, 3])
# 将所有结果合并成一个NumPy数组
final_points_xyz = np.vstack(all_sampled_points) if all_sampled_points else np.array([])
final_labels = np.concatenate(all_sampled_labels).astype(int) if all_sampled_labels else np.array([])
return final_points_xyz, final_labels
# 模拟多个边界框数据
# 盒子1:(0,0,0)到(2,3,1),标签为1
box1 = np.array([
[0.0, 0.0, 0.0, 1], [2.0, 0.0, 0.0, 1], [2.0, 3.0, 0.0, 1], [0.0, 3.0, 0.0, 1],
[0.0, 0.0, 1.0, 1], [2.0, 0.0, 1.0, 1], [2.0, 3.0, 1.0, 1], [0.0, 3.0, 1.0, 1]
])
# 盒子2:(5,5,5)到(6,7,6),标签为2
box2 = np.array([
[5.0, 5.0, 5.0, 2], [6.0, 5.0, 5.0, 2], [6.0, 7.0, 5.0, 2], [5.0, 7.0, 5.0, 2],
[5.0, 5.0, 6.0, 2], [6.0, 5.0, 6.0, 2], [6.0, 7.0, 6.0, 2], [5.0, 7.0, 6.0, 2]
])
# 将多个盒子堆叠成输入格式 (num_boxes, 8, 4)
multiple_boxes_data = np.array([box1, box2])
step_size_multi = 0.5
sampled_points_xyz, sampled_labels = sample_points_in_multiple_boxes(multiple_boxes_data, step_size_multi)
print("\n多个边界框采样结果 (XYZ坐标):")
print(sampled_points_xyz)
print("\n多个边界框采样结果 (标签):")
print(sampled_labels)
print(f"\n总共采样点数量: {len(sampled_points_xyz)}")本文提供了一种使用NumPy np.mgrid函数在3D边界框内高效采样点的方法。通过清晰地定义输入数据结构、利用np.mgrid的强大功能来生成坐标网格,并结合循环处理多个边界框,我们可以构建一个健壮且易于理解的点采样解决方案。在实际应用中,应根据具体需求权衡step_size的选择以及对内存和性能的考量。
以上就是使用NumPy高效地在3D网格中填充点的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号