Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import matplotlib | |
| def visualize_depth(depth: np.ndarray, | |
| depth_min=None, | |
| depth_max=None, | |
| percentile=5, | |
| ret_minmax=False, | |
| cmap='Spectral'): | |
| if depth_min is None: depth_min = np.percentile(depth, percentile) | |
| if depth_max is None: depth_max = np.percentile(depth, 100 - percentile) | |
| if depth_min == depth_max: | |
| depth_min = depth_min - 1e-6 | |
| depth_max = depth_max + 1e-6 | |
| cm = matplotlib.colormaps[cmap] | |
| depth = ((depth - depth_min) / (depth_max - depth_min)).clip(0, 1) | |
| img_colored_np = cm(depth[None], bytes=False)[:, :, :, 0:3] # value from 0 to 1 | |
| img_colored_np = (img_colored_np[0] * 255.0).astype(np.uint8) | |
| if ret_minmax: | |
| return img_colored_np, depth_min, depth_max | |
| else: | |
| return img_colored_np | |
| def unproject_depth(depth, | |
| ixt, | |
| depth_min=0.01, | |
| depth_max=None, | |
| color=None, | |
| ext=None, | |
| conf=None, | |
| ret_pcd=False, | |
| clip_box=None): | |
| height, width = depth.shape | |
| x = np.arange(0, width) | |
| y = np.arange(0, height) | |
| xx, yy = np.meshgrid(x, y) | |
| xx = xx.reshape(-1) | |
| yy = yy.reshape(-1) | |
| zz = depth.reshape(-1) | |
| mask = np.ones_like(xx, dtype=np.bool_) | |
| if depth_min is not None: | |
| mask &= zz >= depth_min | |
| if depth_max is not None: | |
| mask &= zz <= depth_max | |
| if conf is not None: | |
| mask &= conf.reshape(-1) == 2 | |
| xx = xx[mask] | |
| yy = yy[mask] | |
| zz = zz[mask] | |
| pcd = np.stack([xx, yy, np.ones_like(xx)], axis=1) | |
| pcd = pcd * zz[:, None] | |
| pcd = np.dot(pcd, np.linalg.inv(ixt).T) | |
| if ext is not None: | |
| pcd = np.concatenate([pcd, np.ones((pcd.shape[0], 1))], axis=1) | |
| pcd = np.dot(pcd, np.linalg.inv(ext).T) | |
| new_mask = np.ones_like(pcd[:, 0]).astype(np.bool_) | |
| if clip_box is not None: | |
| assert len(clip_box) == 6 | |
| for i, val in enumerate(clip_box): | |
| if val is None: | |
| continue | |
| if i == 0: new_mask &= (pcd[:, 0] <= val) | |
| elif i == 1: new_mask &= (pcd[:, 1] <= val) | |
| elif i == 2: new_mask &= (pcd[:, 2] <= val) | |
| elif i == 3: new_mask &= (pcd[:, 0] >= val) | |
| elif i == 4: new_mask &= (pcd[:, 1] >= val) | |
| elif i == 5: new_mask &= (pcd[:, 2] >= val) | |
| if color is not None: | |
| if color.dtype == np.uint8: | |
| color = color.astype(np.float32) / 255. | |
| if ret_pcd: | |
| points = pcd | |
| import open3d as o3d | |
| pcd = o3d.geometry.PointCloud() | |
| pcd.points = o3d.utility.Vector3dVector(points[:, :3][new_mask]) | |
| pcd.colors = o3d.utility.Vector3dVector(color.reshape(-1, 3)[mask][new_mask]) | |
| else: | |
| return pcd[:, :3][new_mask], color.reshape(-1, 3)[mask][new_mask] | |
| else: | |
| if ret_pcd: | |
| import open3d as o3d | |
| points = pcd | |
| pcd = o3d.geometry.PointCloud() | |
| pcd.points = o3d.utility.Vector3dVector(pcd[:, :3][new_mask]) | |
| else: | |
| return pcd[:, :3][new_mask] | |
| return pcd | |
| if __name__ == '__main__': | |
| depth = np.random.rand(100, 100) | |
| visualize_depth(depth) |