-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathgraphics_utils.py
More file actions
108 lines (88 loc) · 3.16 KB
/
Copy pathgraphics_utils.py
File metadata and controls
108 lines (88 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#
# Copyright (C) 2023, Inria
# GRAPHDECO research group, https://team.inria.fr/graphdeco
# All rights reserved.
#
# This software is free for non-commercial, research and evaluation use
# under the terms of the LICENSE.md file.
#
# For inquiries contact george.drettakis@inria.fr
#
import torch
import math
import numpy as np
from typing import NamedTuple
class BasicPointCloud(NamedTuple):
points : np.array
colors : np.array
normals : np.array
def geom_transform_points(points, transf_matrix):
P, _ = points.shape
ones = torch.ones(P, 1, dtype=points.dtype, device=points.device)
points_hom = torch.cat([points, ones], dim=1)
points_out = torch.matmul(points_hom, transf_matrix.unsqueeze(0))
denom = points_out[..., 3:] + 0.0000001
return (points_out[..., :3] / denom).squeeze(dim=0)
def getWorld2View(R, t):
Rt = np.zeros((4, 4))
Rt[:3, :3] = R.transpose()
Rt[:3, 3] = t
Rt[3, 3] = 1.0
return np.float32(Rt)
def getWorld2View2(R, t, translate=np.array([.0, .0, .0]), scale=1.0):
Rt = np.zeros((4, 4))
Rt[:3, :3] = R.transpose()
Rt[:3, 3] = t
Rt[3, 3] = 1.0
C2W = np.linalg.inv(Rt)
cam_center = C2W[:3, 3]
cam_center = (cam_center + translate) * scale
C2W[:3, 3] = cam_center
Rt = np.linalg.inv(C2W)
return np.float32(Rt)
def getProjectionMatrix(znear, zfar, fovX, fovY):
tanHalfFovY = math.tan((fovY / 2))
tanHalfFovX = math.tan((fovX / 2))
top = tanHalfFovY * znear
bottom = -top
right = tanHalfFovX * znear
left = -right
P = torch.zeros(4, 4)
z_sign = 1.0
P[0, 0] = 2.0 * znear / (right - left)
P[1, 1] = 2.0 * znear / (top - bottom)
P[0, 2] = (right + left) / (right - left)
P[1, 2] = (top + bottom) / (top - bottom)
P[3, 2] = z_sign
P[2, 2] = z_sign * zfar / (zfar - znear)
P[2, 3] = -2 * (zfar * znear) / (zfar - znear) #-(zfar * znear) / (zfar - znear)
return P
# tensor([[ 2.0463e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 2.0546e+00, 0.0000e+00, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 1.0000e+00, -1.0000e-03],
# [ 0.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00]]) [12/10 09:44:14]
# tensor([[ 2.0463e+00, 0.0000e+00, 3.9123e-02, 0.0000e+00],
# [ 0.0000e+00, 2.0546e+00, -5.0103e-03, 0.0000e+00],
# [ 0.0000e+00, 0.0000e+00, 1.0000e+00, -2.0000e-03],
# [ 0.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00]], device='cuda:0') [12/10 09:42:17]
def getProjectionMatrix_refine(K: torch.Tensor, H, W, znear=0.001, zfar=1000):
fx = K[0, 0]
fy = K[1, 1]
cx = K[0, 2]
cy = K[1, 2]
s = K[0, 1]
P = torch.zeros(4, 4, dtype=K.dtype, device=K.device)
z_sign = 1.0
P[0, 0] = 2 * fx / W
P[0, 1] = 2 * s / W
P[0, 2] = -1 + 2 * (cx / W)
P[1, 1] = 2 * fy / H
P[1, 2] = -1 + 2 * (cy / H)
P[2, 2] = z_sign * (zfar + znear) / (zfar - znear)
P[2, 3] = -1 * z_sign * 2 * zfar * znear / (zfar - znear) # z_sign * 2 * zfar * znear / (zfar - znear)
P[3, 2] = z_sign
return P
def fov2focal(fov, pixels):
return pixels / (2 * math.tan(fov / 2))
def focal2fov(focal, pixels):
return 2*math.atan(pixels/(2*focal))