| |
| |
| |
|
|
| import numpy as np |
| import math |
| import torch |
|
|
| OPENCV_TO_OPENGL_CAMERA_CONVENTION = np.array( |
| [[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]] |
| ) |
|
|
|
|
| def perspective_projection(x, K): |
| """ |
| This function computes the perspective projection of a set of points assuming the extrinsinc params have already been applied |
| Args: |
| - x [bs,N,3]: 3D points |
| - K [bs,3,3]: Camera instrincs params |
| """ |
| |
| y = x / x[:, :, -1].unsqueeze(-1) |
|
|
| |
| y = torch.einsum("bij,bkj->bki", K, y) |
|
|
| return y[:, :, :2] |
|
|
|
|
| def inverse_perspective_projection(points, K, distance): |
| """ |
| This function computes the inverse perspective projection of a set of points given an estimated distance. |
| Input: |
| points (bs, N, 2): 2D points |
| K (bs,3,3): camera intrinsics params |
| distance (bs, N, 1): distance in the 3D world |
| Similar to: |
| - pts_l_norm = cv2.undistortPoints(np.expand_dims(pts_l, axis=1), cameraMatrix=K_l, distCoeffs=None) |
| """ |
| |
| points = torch.cat([points, torch.ones_like(points[..., :1])], -1) |
| points = torch.einsum("bij,bkj->bki", torch.inverse(K), points) |
|
|
| |
| if distance == None: |
| return points |
| points = points * distance |
| return points |
|
|
|
|
| def get_focalLength_from_fieldOfView(fov=60, img_size=512): |
| """ |
| Compute the focal length of the camera lens by assuming a certain FOV for the entire image |
| Args: |
| - fov: float, expressed in degree |
| - img_size: int |
| Return: |
| focal: float |
| """ |
| focal = img_size / (2 * np.tan(np.radians(fov) / 2)) |
| return focal |
|
|
|
|
| def focal_length_normalization(x, f, fovn=60, img_size=448): |
| """ |
| Section 3.1 of https://arxiv.org/pdf/1904.02028.pdf |
| E = (fn/f) * E' where E is 1/d |
| """ |
| fn = get_focalLength_from_fieldOfView(fov=fovn, img_size=img_size) |
| y = x * (fn / f) |
| return y |
|
|
|
|
| def undo_focal_length_normalization(y, f, fovn=60, img_size=448): |
| """ |
| Undo focal_length_normalization() |
| """ |
| fn = get_focalLength_from_fieldOfView(fov=fovn, img_size=img_size) |
| x = y * (f / fn) |
| return x |
|
|
|
|
| EPS_LOG = 1e-10 |
|
|
|
|
| def log_depth(x, eps=EPS_LOG): |
| """ |
| Move depth to log space |
| """ |
| return torch.log(x + eps) |
|
|
|
|
| def undo_log_depth(y, eps=EPS_LOG): |
| """ |
| Undo log_depth() |
| """ |
| return torch.exp(y) - eps |
|
|