基于NeRFstudio设计自己的NeRF

之前全面分析了NeRF的代码实现,并且部署了好几个版本的NeRF,其中NeRFstudio这个工具还是非常好用的,而且里面集成了多个先进的NeRF模型,所以本篇文章的目的有三个,理解NeRFstudio的代码结构,学习多个先进的NeRF模型的结构和作用,自己对NeRF进行一定的改进。

一、回顾NeRF

NeRF的作用是将输入的一批2D图像比如视频重建成三维模型,这里的2D图像通常会由colmap进行预处理获得拍摄相机的位姿信息,数据集读取函数会读取图像image矩阵N*H*W*4(RGBA四通道,A是透明度),拍摄相机位姿矩阵pose N*4*4,渲染相机位姿矩阵 Nr*4*4,以及相机焦距F

数据集的json文件如下,由colmap预处理生成,由一系列图像获取拍摄相机的c2w矩阵

    "camera_angle_x": 0.6911112070083618,
    "frames": [
        {
            "file_path": "./test/r_0",
            "rotation": 0.031415926535897934,
            "transform_matrix": [
                [
                    -0.9999999403953552,
                    0.0,
                    0.0,
                    0.0
                ],
                [
                    0.0,
                    -0.7341099977493286,
                    0.6790305972099304,
                    2.737260103225708
                ],
                [
                    0.0,
                    0.6790306568145752,
                    0.7341098785400391,
                    2.959291696548462
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    1.0
                ]
            ]
        },

相机外参(extrinsic matrix)是相机位置和朝向的组合,是一个4x4的矩阵,其作用是将世界坐标系的点变换到相机坐标系下

旋转矩阵的第一列到第三列分别表示了相机坐标系的X, Y, Z轴在世界坐标系下对应的方向;平移向量表示的是相机原点在世界坐标系的对应位置

相机内参(intrinsic matrix)为投影属性,将相机坐标系下的3D坐标映射到2D的图像平面

 

内参矩阵K包含4个值,其中fx和fy是相机的水平和垂直焦距(对于理想的针孔相机,fx=fy)。焦距的物理含义是相机中心到成像平面的距离,长度以像素为单位。cx和cy是图像原点相对于相机光心的水平和垂直偏移量。cx,cy有时候可以用图像宽和高的1/2近似。

扫描二维码关注公众号,回复: 17287062 查看本文章

在NeRF里有imgs2poses.py来实现图像到相机坐标的实现,运行之后会保存为一个poses_bounds.npy,是一个Nx17的矩阵,其中N是图像的数量,即每一张图像有17个参数。其中前面15个参数可以重排成3x5的矩阵形式:

最后两个参数用于表示场景的范围Bounds (bds),是该相机视角下场景点离相机中心最近(near)和最远(far)的距离,所以near/far肯定是大于0的。

这两个值是怎么得到的?是在imgs2poses.py中,计算colmap重建的3D稀疏点在各个相机视角下最近和最远的距离得到的。
这两个值有什么用?之前提到体素渲染需要在一条射线上采样3D点,这就需要一个采样区间,而near和far就是定义了采样区间的最近点和最远点。贴近场景边界的near/far可以使采样点分布更加密集,从而有效地提升收敛速度和渲染质量。
 

猜你喜欢

转载自blog.csdn.net/fisherisfish/article/details/134051351