multi-hmr / utils /camera.py
fbaradel's picture
first commit
934fdee
# Multi-HMR
# Copyright (c) 2024-present NAVER Corp.
# CC BY-NC-SA 4.0 license
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
"""
# Apply perspective distortion
y = x / x[:, :, -1].unsqueeze(-1) # (bs, N, 3)
# Apply camera intrinsics
y = torch.einsum('bij,bkj->bki', K, y) # (bs, N, 3)
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)
"""
# Apply camera intrinsics
points = torch.cat([points, torch.ones_like(points[..., :1])], -1)
points = torch.einsum('bij,bkj->bki', torch.inverse(K), points)
# Apply perspective distortion
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 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
def undo_log_depth(y):
"""
Undo log_depth()
"""
return torch.exp(y)