def test_morton_coding_big_data(self): import point_cloud_utils as pcu import numpy as np import os if os.name == 'nt': num_pts = 10000 num_qpts = 100 else: num_pts = 1000000 num_qpts = 10000 div = 1.0 / 1000.0 pts = np.random.rand(num_pts, 3) / div pts_int = pts.astype(np.int32) qpts = np.random.rand(num_qpts, 3) / div qpts_int = qpts.astype(np.int32) codes = pcu.morton_encode(pts_int) codes_sort_idx = np.argsort(codes) codes_sorted = codes[codes_sort_idx] qcodes = pcu.morton_encode(qpts_int) nn_idx = pcu.morton_knn(codes_sorted, qcodes, 7) codes_sorted[nn_idx] self.assertEqual(nn_idx.shape, (num_qpts, 7))
def test_morton_coding_tiny_data(self): import point_cloud_utils as pcu import numpy as np div = 1.0 / 1000.0 pts = np.random.rand(10, 3) / div pts_int = pts.astype(np.int32) qpts = np.random.rand(10000, 3) / div qpts_int = qpts.astype(np.int32) codes = pcu.morton_encode(pts_int) codes_sort_idx = np.argsort(codes) codes_sorted = codes[codes_sort_idx] qcodes = pcu.morton_encode(qpts_int) nn_idx = pcu.morton_knn(codes_sorted, qcodes, 15) codes_sorted[nn_idx] self.assertEqual(nn_idx.shape, (10000, 10))
import point_cloud_utils as pcu import numpy as np from mayavi import mlab from scipy.spatial import cKDTree k = 50 div = 1.0 / 1000.0 pts = (np.random.rand(10_000, 3) / div).astype(np.int32) qpts = (np.random.rand(100, 3) / div).astype(np.int32) pts[:, 2] = 0.0 qpts[:, 2] = 0.0 codes = pcu.morton_encode(pts) codes_sorted_idx = np.argsort(codes) codes_sorted = codes[codes_sorted_idx] qcodes = pcu.morton_encode(qpts) nn_idx = pcu.morton_knn(codes_sorted, qcodes, k) nn_pts = pcu.morton_decode(codes_sorted[nn_idx[0]]) kdt = cKDTree(pts) _, nn_gt_idx = kdt.query(np.array([qpts[0]]), k=k) print(nn_gt_idx.shape) nn_gt_pts = pts[nn_gt_idx[0]] mlab.points3d(pts[:, 0], pts[:, 1], pts[:, 2], scale_factor=5.0) mlab.points3d([qpts[0, 0]], [qpts[0, 1]], [qpts[0, 2]], scale_factor=7.0, color=(1.0, 0.0, 0.0)) mlab.points3d(nn_pts[:, 0], nn_pts[:, 1], nn_pts[:, 2], scale_factor=9.0, color=(0.0, 0.0, 1.0), opacity=0.5) mlab.points3d(nn_gt_pts[:, 0], nn_gt_pts[:, 1], nn_gt_pts[:, 2], scale_factor=9.0, color=(0.0, 1.0, 0.0), opacity=0.5) mlab.show()
import time start_time = time.time() div = 1.0 / 1000.0 pts = np.random.rand(1_000_000, 3) / div pts_int = pts.astype(np.int32) qpts = np.random.rand(10_000, 3) / div qpts_int = qpts.astype(np.int32) init_time = time.time() codes = pcu.morton_encode(pts_int, sort=False) codes_time = time.time() idxs = np.argsort(codes) sort_time1 = time.time() codes = codes[idxs] sort_time2 = time.time() qcodes = pcu.morton_encode(qpts_int) qcodes_time = time.time() nn_idx = pcu.morton_knn(codes, qcodes, k=20) knn_time = time.time() print(nn_idx.shape)
import point_cloud_utils as pcu import numpy as np # Lots of data div = 1.0 / 1000.0 pts = np.random.rand(1_000_000, 3) / div pts_int = pts.astype(np.int32) qpts = np.random.rand(10_000, 3) / div qpts_int = qpts.astype(np.int32) codes = pcu.morton_encode(pts_int) codes_sort_idx = np.argsort(codes) codes_sorted = codes[codes_sort_idx] qcodes = pcu.morton_encode(qpts_int) nn_idx = pcu.morton_knn(codes_sorted, qcodes, 7) codes_sorted[nn_idx] print("0 --------------------------------") print(nn_idx.shape) print(nn_idx) print("\n") # 1nn div = 1.0 / 1000.0 pts = np.random.rand(1_000_000, 3) / div pts_int = pts.astype(np.int32) qpts = np.random.rand(10_000, 3) / div qpts_int = qpts.astype(np.int32)