mirror of
https://github.com/graphdeco-inria/gaussian-splatting
synced 2025-04-08 15:04:14 +00:00
72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
#
|
||
# 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
|
||
from torch import nn
|
||
import numpy as np
|
||
from utils.graphics_utils import getWorld2View2, getProjectionMatrix
|
||
|
||
class Camera(nn.Module):
|
||
def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask,
|
||
image_name, uid,
|
||
trans=np.array([0.0, 0.0, 0.0]), scale=1.0, data_device = "cuda"
|
||
):
|
||
super(Camera, self).__init__()
|
||
|
||
self.uid = uid
|
||
self.colmap_id = colmap_id
|
||
self.R = R # 相机到世界的 C2W
|
||
self.T = T # 世界到相机的 W2C
|
||
self.FoVx = FoVx
|
||
self.FoVy = FoVy
|
||
self.image_name = image_name
|
||
|
||
try:
|
||
self.data_device = torch.device(data_device)
|
||
except Exception as e:
|
||
print(e)
|
||
print(f"[Warning] Custom device {data_device} failed, fallback to default cuda device" )
|
||
self.data_device = torch.device("cuda")
|
||
|
||
self.original_image = image.clamp(0.0, 1.0).to(self.data_device) # tensor, 归一化的 C H W
|
||
self.image_width = self.original_image.shape[2]
|
||
self.image_height = self.original_image.shape[1]
|
||
|
||
if gt_alpha_mask is not None:
|
||
self.original_image *= gt_alpha_mask.to(self.data_device)
|
||
else:
|
||
self.original_image *= torch.ones((1, self.image_height, self.image_width), device=self.data_device)
|
||
|
||
self.zfar = 100.0
|
||
self.znear = 0.01
|
||
|
||
self.trans = trans
|
||
self.scale = scale
|
||
|
||
self.world_view_transform = torch.tensor(getWorld2View2(R, T, trans, scale)).transpose(0, 1).cuda() # C2W 相机到世界的变换矩阵
|
||
self.projection_matrix = getProjectionMatrix(znear=self.znear, zfar=self.zfar, fovX=self.FoVx, fovY=self.FoVy).transpose(0,1).cuda() # 生成了一个投影矩阵,用于将视图坐标投影到图像平面
|
||
self.full_proj_transform = (self.world_view_transform.unsqueeze(0).bmm(self.projection_matrix.unsqueeze(0))).squeeze(0) # 使用 bmm(批量矩阵乘法)将世界到视图变换矩阵和投影矩阵相乘,生成完整的投影变换矩阵
|
||
self.camera_center = self.world_view_transform.inverse()[3, :3] # 通过求逆变换矩阵获取相机在世界坐标系中的位置(相机中心)
|
||
|
||
class MiniCam:
|
||
def __init__(self, width, height, fovy, fovx, znear, zfar, world_view_transform, full_proj_transform):
|
||
self.image_width = width
|
||
self.image_height = height
|
||
self.FoVy = fovy
|
||
self.FoVx = fovx
|
||
self.znear = znear
|
||
self.zfar = zfar
|
||
self.world_view_transform = world_view_transform
|
||
self.full_proj_transform = full_proj_transform
|
||
view_inv = torch.inverse(self.world_view_transform)
|
||
self.camera_center = view_inv[3][:3]
|
||
|