OpenMVS & OpenMVG 笔记
OpenMVS 和 OpenMVG 都是计算机视觉中用于三维重建的开源库。两者都可以实现从图像集合中计算出相机位姿和三维点云,但它们的重点略有不同。 OpenMVG 主要关注于从输入图像集合中提取稠密的特征匹配,通过这些匹配计算相机的位姿和场景中的点云。它提供了一套完整的结构从运动(Structure-from-Motion, SFM)框架,包括图像处理、特征描述和匹配、相机标定、相机位姿估计等等。 而 OpenMVS 则更加关注于基于密集的点云进行表面重建和纹理映射,从而得到高质量的三维模型。OpenMVS 可以接受 OpenMVG 的输出作为输入,进一步优化重建结果,并进行多个视角的三维模型融合。 因此,可以说 OpenMVG 更加偏向于提取几何信息,而 OpenMVS 更加偏向于提取纹理信息。两者的结合则可以得到更为丰富的三维重建结果。
OpenMVS
OpenMVS (Multi-View Stereo) 是一个面向计算机视觉科学家的库,特别针对 Multi-View Stereo 重建社区。虽然有成熟且完整的开源项目针对运动结构管道(如 OpenMVG),可以从输入图像集中恢复摄像机姿势和稀疏 3D 点云,但没有一个项目解决摄影测量链流的最后一部分。OpenMVS 旨在通过提供一整套算法来填补这一空白,以恢复要重建的场景的整个表面。输入是一组摄像机姿势加上稀疏点云,输出是一个带纹理的网格。本项目涵盖的主要主题是:
- 密集的点云重建,以获得尽可能完整和准确的点云
- 网格重建,用于估计最能解释输入点云的网格表面
- 用于恢复所有精细细节的网格细化
- 网格纹理,用于计算清晰准确的纹理,为网格着色
OpenMVG
Open Multiple View Geometry 开源多视图几何体
OpenMVG 提供从由库、二进制文件和管道组合的图像框架的端到端 3D 重建。
- 这些库提供了对以下功能的轻松访问:图像操作、特征描述和匹配、特征跟踪、相机模型、多视图几何、鲁棒估计、运动结构算法…
- 二进制文件解决了管道可能需要的单元任务:场景初始化、特征检测和匹配以及运动结构重建,将重建的场景导出到其他多视图立体视觉框架以计算密集的点云或纹理网格。
- 管道是通过链接各种二进制文件来创建的,以计算图像匹配关系,解决运动结构问题(重建、三角测量、定位)和…
OpenMVG 使用 C++ 开发,可在 Android、iOS、Linux、macOS 和 Windows 上运行。
SFM 运动结构恢复(Structure from motion)数十年来一直是计算机视觉领域的热门研究方向之一,实现了众多实际应用,尤其在近景三维重建中,该算法从获取的目标物系列影像出发,最终获取较高精度的目标物稀疏三维点云。
OpenMVG 数据结构
OpenMVG 围绕三种数据结构进行阐述,称为 SfM_Data、Regions(区域)和 PairWiseMatches。
SfM_data 数据结构是一个通用容器,用于存储以下对象之间的关系:
- Views 图像文件名和对相机内部和姿态的引用
- Intrinsics 相机内部参数
- Poses 姿态摄像机外部参数
- LandMarks 3D 结构(3D 点及其可见性信息)
struct SfM_Data
{Views views; /// reference to the used images (each image link to a pose and intrinsic camera id)Poses poses; /// poses data (indexed by view.id_pose)Intrinsics intrinsics; /// intrinsics camera data (indexed by view.id_intrinsic)Landmarks structure; /// Structure (3D points with their 2D observations)
...
};
Regions 数据结构是用于存储图像描述的通用容器:
- Features (point-based)
- Descriptors (可以是标量向量或二进制值)
PairWiseMatches 数据结构用于存储一对图像之间相应特征的索引。
注意:
- SfM_data/Views 是唯一的,而 Intrinsics 和 Poses 可以共享。
- SfM_Data结构 IO 可以是 JSON/XML/BINARY,以简化与工具的互操作性,也可以是 PLY(仅输出)以实现可视化。
OpenMVG 管道围绕两个主要概念进行阐述:
- Abstract Data Providers
- Features_provider
- Regions_Provider
- Matches_Provider
- Abstract Processing Engines
- ReconstructionEngine
API 允许轻松实现新管道并使用用户想要利用的任何数据格式。
以下是 OpenMVG 数据结构、数据提供程序、二进制文件和管道系统的概述:
安装
使用vcpkg
安装openmvs
时,会同时安装openmvg
。
vcpkg install openmvs:x64-windows
使用
openmvg
就是从获取的目标物系列影像出发,最终获取较高精度的目标物稀疏三维点云,即生成SFM。
直接运行openmvg
安装目录中的tutorial_demo.py
:
python tutorial_demo.py
结果如下:
具体步骤参见:
Convert SfM scene from OpenMVG
将openmvg的SFM结果转换到openmvs:
openMVG_main_openMVG2openMVS.exe -i tutorial_out\reconstruction_sequential\sfm_data.bin -o scene.mvs -d .\images
可视化openmvs sfm场景:
View.exe scene.mvs
Dense Point-Cloud Reconstruction
DensifyPointCloud.exe scene.mvs
提取稠密点云数据,生成scene_dense.mvs
和稠密点云数据scene_dense.ply
View.exe scene_dense.mvs
Rough Mesh Reconstruction
点云重建生成scene_dense_mesh.mvs
和网格体scene_dense_mesh.ply
ReconstructMesh.exe scene_dense.mvs
View.exe scene_dense_mesh.mvs
Mesh Texturing
生成纹理scene_dense_mesh_texture.mvs
,scene_dense_mesh_texture.ply
和scene_dense_mesh_texture.ply
TextureMesh.exe scene_dense_mesh.mvs -o scene_dense_mesh_texture.mvs
View.exe scene_dense_mesh_texture.mvs
纹理图片: