Octree#
octree_find_leaf.py#
1# ----------------------------------------------------------------------------
2# - Open3D: www.open3d.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.open3d.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import open3d as o3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = o3d.data.ArmadilloMesh()
14 pcd = o3d.io.read_triangle_mesh(
15 armadillo_data.path).sample_points_poisson_disk(N)
16 # Fit to unit cube.
17 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
18 center=pcd.get_center())
19 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
20 size=(N, 3)))
21
22 octree = o3d.geometry.Octree(max_depth=4)
23 octree.convert_from_point_cloud(pcd, size_expand=0.01)
24 print('Displaying input octree ...')
25 o3d.visualization.draw([octree])
26 print('Finding leaf node containing the first point of pointcloud ...')
27 print(octree.locate_leaf_node(pcd.points[0]))
octree_from_voxel_grid.py#
1# ----------------------------------------------------------------------------
2# - Open3D: www.open3d.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.open3d.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import open3d as o3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = o3d.data.ArmadilloMesh()
14 pcd = o3d.io.read_triangle_mesh(
15 armadillo_data.path).sample_points_poisson_disk(N)
16 # Fit to unit cube.
17 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
18 center=pcd.get_center())
19 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
20 size=(N, 3)))
21 print('Displaying input voxel grid ...')
22 voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,
23 voxel_size=0.05)
24 o3d.visualization.draw([voxel_grid])
25
26 octree = o3d.geometry.Octree(max_depth=4)
27 octree.create_from_voxel_grid(voxel_grid)
28 print('Displaying octree ..')
29 o3d.visualization.draw([octree])
octree_point_cloud.py#
1# ----------------------------------------------------------------------------
2# - Open3D: www.open3d.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.open3d.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import open3d as o3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = o3d.data.ArmadilloMesh()
14 pcd = o3d.io.read_triangle_mesh(
15 armadillo_data.path).sample_points_poisson_disk(N)
16 # Fit to unit cube.
17 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
18 center=pcd.get_center())
19 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
20 size=(N, 3)))
21 print('Displaying input pointcloud ...')
22 o3d.visualization.draw([pcd])
23
24 octree = o3d.geometry.Octree(max_depth=4)
25 octree.convert_from_point_cloud(pcd, size_expand=0.01)
26 print('Displaying octree ..')
27 o3d.visualization.draw([octree])
octree_traversal.py#
1# ----------------------------------------------------------------------------
2# - Open3D: www.open3d.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.open3d.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import open3d as o3d
9import numpy as np
10
11
12def f_traverse(node, node_info):
13 early_stop = False
14
15 if isinstance(node, o3d.geometry.OctreeInternalNode):
16 if isinstance(node, o3d.geometry.OctreeInternalPointNode):
17 n = 0
18 for child in node.children:
19 if child is not None:
20 n += 1
21 print(
22 "{}{}: Internal node at depth {} has {} children and {} points ({})"
23 .format(' ' * node_info.depth,
24 node_info.child_index, node_info.depth, n,
25 len(node.indices), node_info.origin))
26
27 # We only want to process nodes / spatial regions with enough points.
28 early_stop = len(node.indices) < 250
29 elif isinstance(node, o3d.geometry.OctreeLeafNode):
30 if isinstance(node, o3d.geometry.OctreePointColorLeafNode):
31 print("{}{}: Leaf node at depth {} has {} points with origin {}".
32 format(' ' * node_info.depth, node_info.child_index,
33 node_info.depth, len(node.indices), node_info.origin))
34 else:
35 raise NotImplementedError('Node type not recognized!')
36
37 # Early stopping: if True, traversal of children of the current node will be skipped.
38 return early_stop
39
40
41if __name__ == "__main__":
42 N = 2000
43 armadillo_data = o3d.data.ArmadilloMesh()
44 pcd = o3d.io.read_triangle_mesh(
45 armadillo_data.path).sample_points_poisson_disk(N)
46 # Fit to unit cube.
47 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
48 center=pcd.get_center())
49 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
50 size=(N, 3)))
51
52 octree = o3d.geometry.Octree(max_depth=4)
53 octree.convert_from_point_cloud(pcd, size_expand=0.01)
54 print('Displaying input octree ...')
55 o3d.visualization.draw([octree])
56 print('Traversing octree ...')
57 octree.traverse(f_traverse)