|
|
- 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
|