|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
nerf的train()代码中有一行:
rays_rgb = np.concatenate([rays, images[:,None]], 1) # [N, ro+rd+rgb, H, W, 3]
有注解称rays_rgb的形状是[20,3,378,504,3],
想问一下ro,rd,rgb为什么都等于1?original应该是3维坐标,direction应该是2个角度,rgb应该是3个值控制颜色,不应该分别是5,2,3吗?
本帖最后由 isdkz 于 2023-6-23 22:02 编辑
这个问题涉及到了3D计算机视觉和光线追踪中的一些基础概念。从代码中,我们可以看到 rays_rgb 是由 rays 和 images 通过 np.concatenate 连接在一起得到的,其形状应该由 rays 和 images 两部分的形状决定。
首先我们来看 rays ,从代码中可以看出, rays 是通过函数 get_rays_np 得到的。在这个函数中,首先通过对图像的宽度(W)和高度(H)进行meshgrid操作,得到了平面上每个像素的坐标(i,j)。然后,根据这些坐标,计算出从相机坐标系出发的每个像素对应的光线方向 dirs 。最后,通过坐标转换将这些方向从相机坐标系转换到世界坐标系,得到了 rays_d 。同时,相机的原点在世界坐标系中的位置就是所有光线的原点 rays_o 。所以, get_rays_np 函数返回了每个光线的原点(即起点)和方向,即rays_o和rays_d,都是3维的,所以ro和rd应该都等于3,而不是1。
然后我们看 images ,它应该是一个4D张量,形状为[N, H, W, 3],代表N张RGB图像,每张图像的尺寸为H x W,并且每个像素有3个颜色通道。在这里, images[:,None] 将 images 的形状从[N, H, W, 3]变为[N, 1, H, W, 3]。
最后, rays 和 images[:,None] 通过 np.concatenate 沿着第二个维度(索引为1)连接在一起,得到了 rays_rgb 。由于 rays 的形状为[N, ro+rd, H, W, 3](其中ro和rd都等于3)和 images[:,None] 的形状为[N, 1, H, W, 3],所以 rays_rgb 的形状应该为[N, ro+rd+1, H, W, 3],也就是[N, 7, H, W, 3]。
所以,这个注释可能是有误的。如果你看到形状为[20, 3, 378, 504, 3],那么可能ro, rd, rgb分别为1,1,1,而不是3,3,3。或者注释中的3指的是这三个维度(ro, rd, rgb)的总和,也就是3=1+1+1。总之,为了确定真正的形状,你可能需要直接打印这些变量的形状。
|
|