PyTorch3D渲染COLMAP重建的物体
发布网友
发布时间:2024-09-28 04:58
我来回答
共1个回答
热心网友
时间:2024-10-07 07:09
本文将介绍如何在 PyTorch3D 中读取 COLMAP 生成的相机渲染重建物体结果,并获取相应的深度图和法线图。假设读者已熟悉 PyTorch3D,可参考官方文档(https://pytorch3d.org/docs/renderer_getting_started)。
注:相关代码和示例数据可在 Github (github.com/guanyingc/py...)上找到。
PyTorch3D 的坐标系
首先,让我们了解 PyTorch3D 官方文档中提到的几种坐标系定义,包括世界坐标系、相机坐标系、NDC 坐标系和屏幕坐标系。
本文还将对比 PyTorch3D 的相机坐标系与《NeRF代码解读-相机参数与坐标系变换》中讨论的常见相机坐标系的异同。
最后一列展示了 PyTorch3D 使用的是右手坐标系,方向有所不同。相机的 Z 轴向前,X 轴向左,Y 轴向上(LUF)。
注意事项
以下是编写代码时需要注意的两个重要点。
给定三维模型渲染图像
官方网站提供了一个示例,读者可以尝试运行:pytorch3d.org/tutorials...
大致流程包括导入三维模型、设置相机、光照和渲染器,然后执行渲染操作。接下来,我将简要介绍几个关键要点。
三维模型的朝向
在世界坐标系中,三维模型的朝向表现为牛模型的脸朝向负方向的 Z 轴。值得注意的是,红绿蓝(RGB)颜色通道分别对应于 XYZ 轴。
相机位姿定义
相机位姿的定义可以采用多种方式,其中一种方式是直接给定旋转矩阵和平移向量 RT(稍后会详细介绍)。另一种方式是通过样例中使用的 look_at_view_transform(distance, elevation, azimuth) 函数获得,该函数可生成一个相机位姿,使相机轴心指向原点。在此,需要设定相机与原点的距离,以及俯仰角(elevation)和方位角(azimuth)。
这里需要查阅一下 API 文档,看看这个俯仰角和方位角是相对哪个轴而言的。
可以看到方位角是相对正 z 轴方向 [0,0,1] 而言的。
这时可以看到,如果我们将俯仰角和方位角都设置为 0,将会看到模型的背面。因此样例代码是把方位角设置成 180 度。
利用 COLMAP 相机渲染重建的物体
有时候,我们希望对一个重建的三维模型进行渲染,以获得与实际拍摄视角相对应的图像以及深度等信息。
以 COLMAP 密集重建所得的三维模型为例,我们将介绍这个过程。这里并不会详细展开关于 COLMAP 的使用,有兴趣的读者可以查看 colmap.github.io/cli.ht...
总体流程包括读取三维模型、导入相机参数、配置光照和渲染器,然后进行渲染操作。下面将简要介绍几个关键要点。
读取 COLMAP 相机参数
下面是其中一个相机对应的参数:
{ 'img_name': 'IMG_20221210_112836.jpg', 'intrinsics': array([1567.46842128, 1567.11882971, 1000., 745.5 ]), 'H': 1491, 'W': 2000, 'w2c': tensor([[-0.5214, 0.5889, -0.6175, 0.6818], [-0.7234, 0.0787, 0.6859, -3.2761], [ 0.4526, 0.8043, 0.3850, 1.9347], [ 0.0000, 0.0000, 0.0000, 1.0000]])}
设置 PyTorch3D 相机参数
在这里,我们将以 PyTorch3D 中的透视相机(perspective)为例进行说明。
对于外部参数(外参),我们需要先将 COLMAP 中的相机朝向转换为 PyTorch3D 的相机朝向。
如果想要降低图像分辨率,需要调整相机的内部参数(内参)。
设置渲染器
由于 COLMAP 重建的 mesh 没有纹理贴图,这里使用 pytorch3d.renderer.SoftSilhouetteShader() 渲染 mask。
渲染深度和法线图渲染结果图
感兴趣的读者可以自己跑代码熟悉一下。如有错误,还请批评指正,谢谢!
热心网友
时间:2024-10-07 07:14
本文将介绍如何在 PyTorch3D 中读取 COLMAP 生成的相机渲染重建物体结果,并获取相应的深度图和法线图。假设读者已熟悉 PyTorch3D,可参考官方文档(https://pytorch3d.org/docs/renderer_getting_started)。
注:相关代码和示例数据可在 Github (github.com/guanyingc/py...)上找到。
PyTorch3D 的坐标系
首先,让我们了解 PyTorch3D 官方文档中提到的几种坐标系定义,包括世界坐标系、相机坐标系、NDC 坐标系和屏幕坐标系。
本文还将对比 PyTorch3D 的相机坐标系与《NeRF代码解读-相机参数与坐标系变换》中讨论的常见相机坐标系的异同。
最后一列展示了 PyTorch3D 使用的是右手坐标系,方向有所不同。相机的 Z 轴向前,X 轴向左,Y 轴向上(LUF)。
注意事项
以下是编写代码时需要注意的两个重要点。
给定三维模型渲染图像
官方网站提供了一个示例,读者可以尝试运行:pytorch3d.org/tutorials...
大致流程包括导入三维模型、设置相机、光照和渲染器,然后执行渲染操作。接下来,我将简要介绍几个关键要点。
三维模型的朝向
在世界坐标系中,三维模型的朝向表现为牛模型的脸朝向负方向的 Z 轴。值得注意的是,红绿蓝(RGB)颜色通道分别对应于 XYZ 轴。
相机位姿定义
相机位姿的定义可以采用多种方式,其中一种方式是直接给定旋转矩阵和平移向量 RT(稍后会详细介绍)。另一种方式是通过样例中使用的 look_at_view_transform(distance, elevation, azimuth) 函数获得,该函数可生成一个相机位姿,使相机轴心指向原点。在此,需要设定相机与原点的距离,以及俯仰角(elevation)和方位角(azimuth)。
这里需要查阅一下 API 文档,看看这个俯仰角和方位角是相对哪个轴而言的。
可以看到方位角是相对正 z 轴方向 [0,0,1] 而言的。
这时可以看到,如果我们将俯仰角和方位角都设置为 0,将会看到模型的背面。因此样例代码是把方位角设置成 180 度。
利用 COLMAP 相机渲染重建的物体
有时候,我们希望对一个重建的三维模型进行渲染,以获得与实际拍摄视角相对应的图像以及深度等信息。
以 COLMAP 密集重建所得的三维模型为例,我们将介绍这个过程。这里并不会详细展开关于 COLMAP 的使用,有兴趣的读者可以查看 colmap.github.io/cli.ht...
总体流程包括读取三维模型、导入相机参数、配置光照和渲染器,然后进行渲染操作。下面将简要介绍几个关键要点。
读取 COLMAP 相机参数
下面是其中一个相机对应的参数:
{ 'img_name': 'IMG_20221210_112836.jpg', 'intrinsics': array([1567.46842128, 1567.11882971, 1000., 745.5 ]), 'H': 1491, 'W': 2000, 'w2c': tensor([[-0.5214, 0.5889, -0.6175, 0.6818], [-0.7234, 0.0787, 0.6859, -3.2761], [ 0.4526, 0.8043, 0.3850, 1.9347], [ 0.0000, 0.0000, 0.0000, 1.0000]])}
设置 PyTorch3D 相机参数
在这里,我们将以 PyTorch3D 中的透视相机(perspective)为例进行说明。
对于外部参数(外参),我们需要先将 COLMAP 中的相机朝向转换为 PyTorch3D 的相机朝向。
如果想要降低图像分辨率,需要调整相机的内部参数(内参)。
设置渲染器
由于 COLMAP 重建的 mesh 没有纹理贴图,这里使用 pytorch3d.renderer.SoftSilhouetteShader() 渲染 mask。
渲染深度和法线图渲染结果图
感兴趣的读者可以自己跑代码熟悉一下。如有错误,还请批评指正,谢谢!