from numba import jit, njit import numpy as np @njit(fastmath=True) def numba_image_to_pointcloud(depth_image, bounding_box, camera_matrix): x_min, y_min, x_max, y_max = bounding_box h, w = depth_image.shape # check and correct the bounding box to be within the rgb_image x_min = int(round(max(0, x_min))) y_min = int(round(max(0, y_min))) x_max = int(round(min(w-1, x_max))) y_max = int(round(min(h-1, y_max))) if x_max < x_min: x_max = x_min if y_max < y_min: y_max = y_min f_x = camera_matrix[0,0] c_x = camera_matrix[0,2] f_y = camera_matrix[1,1] c_y = camera_matrix[1,2] out_w = (x_max - x_min) + 1 out_h = (y_max - y_min) + 1 points = np.empty((out_h * out_w, 3), dtype=np.float32) i = 0 x = x_min while x <= x_max: y = y_min while y <= y_max: z_3d = depth_image[y,x] / 1000.0 x_3d = ((x - c_x) / f_x) * z_3d y_3d = ((y - c_y) / f_y) * z_3d points[i] = (x_3d, y_3d, z_3d) i += 1 y += 1 x += 1 return points