Octree
octree_find_leaf.py
27import open3d as o3d
28import numpy as np
29
30if __name__ == "__main__":
31 N = 2000
32 armadillo_data = o3d.data.ArmadilloMesh()
33 pcd = o3d.io.read_triangle_mesh(
34 armadillo_data.path).sample_points_poisson_disk(N)
35 # Fit to unit cube.
36 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
37 center=pcd.get_center())
38 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
39 size=(N, 3)))
40
41 octree = o3d.geometry.Octree(max_depth=4)
42 octree.convert_from_point_cloud(pcd, size_expand=0.01)
43 print('Displaying input octree ...')
44 o3d.visualization.draw([octree])
45 print('Finding leaf node containing the first point of pointcloud ...')
46 print(octree.locate_leaf_node(pcd.points[0]))
octree_from_voxel_grid.py
27import open3d as o3d
28import numpy as np
29
30if __name__ == "__main__":
31 N = 2000
32 armadillo_data = o3d.data.ArmadilloMesh()
33 pcd = o3d.io.read_triangle_mesh(
34 armadillo_data.path).sample_points_poisson_disk(N)
35 # Fit to unit cube.
36 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
37 center=pcd.get_center())
38 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
39 size=(N, 3)))
40 print('Displaying input voxel grid ...')
41 voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,
42 voxel_size=0.05)
43 o3d.visualization.draw([voxel_grid])
44
45 octree = o3d.geometry.Octree(max_depth=4)
46 octree.create_from_voxel_grid(voxel_grid)
47 print('Displaying octree ..')
48 o3d.visualization.draw([octree])
octree_point_cloud.py
27import open3d as o3d
28import numpy as np
29
30if __name__ == "__main__":
31 N = 2000
32 armadillo_data = o3d.data.ArmadilloMesh()
33 pcd = o3d.io.read_triangle_mesh(
34 armadillo_data.path).sample_points_poisson_disk(N)
35 # Fit to unit cube.
36 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
37 center=pcd.get_center())
38 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
39 size=(N, 3)))
40 print('Displaying input pointcloud ...')
41 o3d.visualization.draw([pcd])
42
43 octree = o3d.geometry.Octree(max_depth=4)
44 octree.convert_from_point_cloud(pcd, size_expand=0.01)
45 print('Displaying octree ..')
46 o3d.visualization.draw([octree])
octree_traversal.py
27import open3d as o3d
28import numpy as np
29
30
31def f_traverse(node, node_info):
32 early_stop = False
33
34 if isinstance(node, o3d.geometry.OctreeInternalNode):
35 if isinstance(node, o3d.geometry.OctreeInternalPointNode):
36 n = 0
37 for child in node.children:
38 if child is not None:
39 n += 1
40 print(
41 "{}{}: Internal node at depth {} has {} children and {} points ({})"
42 .format(' ' * node_info.depth,
43 node_info.child_index, node_info.depth, n,
44 len(node.indices), node_info.origin))
45
46 # We only want to process nodes / spatial regions with enough points.
47 early_stop = len(node.indices) < 250
48 elif isinstance(node, o3d.geometry.OctreeLeafNode):
49 if isinstance(node, o3d.geometry.OctreePointColorLeafNode):
50 print("{}{}: Leaf node at depth {} has {} points with origin {}".
51 format(' ' * node_info.depth, node_info.child_index,
52 node_info.depth, len(node.indices), node_info.origin))
53 else:
54 raise NotImplementedError('Node type not recognized!')
55
56 # Early stopping: if True, traversal of children of the current node will be skipped.
57 return early_stop
58
59
60if __name__ == "__main__":
61 N = 2000
62 armadillo_data = o3d.data.ArmadilloMesh()
63 pcd = o3d.io.read_triangle_mesh(
64 armadillo_data.path).sample_points_poisson_disk(N)
65 # Fit to unit cube.
66 pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
67 center=pcd.get_center())
68 pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
69 size=(N, 3)))
70
71 octree = o3d.geometry.Octree(max_depth=4)
72 octree.convert_from_point_cloud(pcd, size_expand=0.01)
73 print('Displaying input octree ...')
74 o3d.visualization.draw([octree])
75 print('Traversing octree ...')
76 octree.traverse(f_traverse)