Octree#
octree_find_leaf.py#
1# ----------------------------------------------------------------------------
2# - CloudViewer: www.cloudViewer.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.cloudViewer.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import cloudViewer as cv3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = cv3d.data.ArmadilloMesh()
14 pcd = cv3d.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.set_colors(
20 cv3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3))))
21 print(pcd)
22
23 octree = cv3d.geometry.Octree(max_depth=4)
24 octree.convert_from_point_cloud(pcd, size_expand=0.01)
25 print('Displaying input octree ...')
26 cv3d.visualization.draw([octree])
27 print('Finding leaf node containing the first point of pointcloud ...')
28 print(octree.locate_leaf_node(pcd.get_points()[0]))
octree_from_voxel_grid.py#
1# ----------------------------------------------------------------------------
2# - CloudViewer: www.cloudViewer.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.cloudViewer.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import cloudViewer as cv3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = cv3d.data.ArmadilloMesh()
14 pcd = cv3d.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.set_colors(
20 cv3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3))))
21 print('Displaying input voxel grid ...')
22 voxel_grid = cv3d.geometry.VoxelGrid.create_from_point_cloud(
23 pcd, voxel_size=0.05)
24 cv3d.visualization.draw([voxel_grid])
25
26 octree = cv3d.geometry.Octree(max_depth=4)
27 octree.create_from_voxel_grid(voxel_grid)
28 print('Displaying octree ..')
29 cv3d.visualization.draw([octree])
octree_point_cloud.py#
1# ----------------------------------------------------------------------------
2# - CloudViewer: www.cloudViewer.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.cloudViewer.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import cloudViewer as cv3d
9import numpy as np
10
11if __name__ == "__main__":
12 N = 2000
13 armadillo_data = cv3d.data.ArmadilloMesh()
14 pcd = cv3d.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.set_colors(
20 cv3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3))))
21 print('Displaying input pointcloud ...')
22 cv3d.visualization.draw([pcd])
23
24 octree = cv3d.geometry.Octree(max_depth=4)
25 octree.convert_from_point_cloud(pcd, size_expand=0.01)
26 print(octree)
27 print('Displaying octree ..')
28 cv3d.visualization.draw([octree])
octree_traversal.py#
1# ----------------------------------------------------------------------------
2# - CloudViewer: www.cloudViewer.org -
3# ----------------------------------------------------------------------------
4# Copyright (c) 2018-2024 www.cloudViewer.org
5# SPDX-License-Identifier: MIT
6# ----------------------------------------------------------------------------
7
8import cloudViewer as cv3d
9import numpy as np
10
11
12def f_traverse(node, node_info):
13 early_stop = False
14
15 if isinstance(node, cv3d.geometry.OctreeInternalNode):
16 if isinstance(node, cv3d.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, cv3d.geometry.OctreeLeafNode):
30 if isinstance(node, cv3d.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 = cv3d.data.ArmadilloMesh()
44 pcd = cv3d.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.set_colors(
50 cv3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3))))
51
52 octree = cv3d.geometry.Octree(max_depth=4)
53 octree.convert_from_point_cloud(pcd, size_expand=0.01)
54 print('Displaying input octree ...')
55 cv3d.visualization.draw([octree])
56 print('Traversing octree ...')
57 octree.traverse(f_traverse)