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