前言
OpenMVG(Open Multiple View Geometry)是一个开源的项目,主要用于处理计算机视觉和摄影测量学中的多视图几何问题,尤其在三维重建领域有着广泛的应用。它通过一系列工具和算法,能够从一组无序的图像中恢复场景的稀疏三维结构,包括特征的提取与计算、特征点的匹配以及运动恢复结构的解算等步骤。OpenMVG支持多种相机模型,能够估计相机的内参和外参,并提供多种特征提取与匹配算法,如SIFT和SURF等,以满足不同的应用场景需求。
该库使用C++编写,具有简洁的代码设计和良好的可读性,方便开发者进行二次开发和扩展。同时,它采用严格的测试驱动开发方式,确保了模块的稳定性和可靠性。此外,OpenMVG可以与其他开源项目(如OpenMVS、CMVS-PMVS)无缝结合,实现从稀疏点云到稠密点云、表面重建以及纹理映射的完整三维重建管线,从而满足从简单到复杂的各种三维重建需求。总之,OpenMVG以其强大的功能、灵活的扩展性和广泛的适用性,成为计算机视觉和三维重建领域中不可或缺的开源工具之一。
main_SfMInit_ImageListing
这个程序主要用于从输入的图像集合中提取必要的信息(如包括图像目录、传感器宽度数据库文件、输出目录、相机内参、是否使用GPS姿态先验等),并生成一个用于后续三维重建的SfM(Structure from Motion)数据文件。
从主函数的入口进入,通过命令行参数了解程序的输入。
命令行参数
-
程序支持的命令行参数及其对应的变量:
-
-i imageDirectory
:输入图像目录 -
-d
sensorWidthDatabase
:传感器宽度数据库文件路径 -
-o
outputDirectory
:输出目录 -
-f
focal
:焦距(以像素为单位) -
-k
intrinsics
:相机内参矩阵 -
-c
camera_model
:相机模型 -
-g
group_camera_model
:是否对相机模型进行分组 -
-P
use_pose_prior
:是否使用GPS姿态先验 -
-W
prior_weights
:姿态先验权重 -
-m
gps_to_xyz_method
:GPS坐标转换方法(0为ECEF,1为UTM)。
如果用户没有提供任何参数,程序会抛出一个异常信息,接着程序会输出详细的使用说明:所有支持的命令行参数及其含义。
将用户输入的命令行参数值输出到日志中,方便确认程序的配置是否正确
接下来是进行一些必要的初始化操作,初始化图像属性,检查输入输出目录、解析传感器宽度数据库文件、内参矩阵等输入的参数都是有效的,避免出现错误。
生成图像列表文件sfm_data.json
接下来的代码是程序的核心部分,负责处理输入图像目录中的所有图像,提取它们的图像属性(如尺寸、焦距等),并根据这些信息构建一个用于后续三维重建的SfM(Structure from Motion)数据结构sfm_data。
获取指定输入图像目录
sImageDir
中的所有文件名,并将它们存储在 vec_image
中,对文件名列表进行排序
初始化SfM数据结构,创建一个空的SfM数据结构 sfm_data,
输入图像目录,获取SfM数据结构中的视图(views
)和内参(intrinsics
)的引用,以便后续添加图像视图和相机内参
初始化进度条和错误报告流,显示处理图像进度,记录处理过程中遇到的错误信息
遍历图像文件列表
读取图像元数据,初始化图像属性变量(宽度、高度、焦距等),记录完整的图像文件路径 sImageFilename
,并提取文件名部分 sImFilenamePart
检查图像文件的格式是否受支持
检查是否为掩膜图像
读取图像的头信息(如宽度、高度等)
处理焦距信息:如果提供了内参矩阵字符串(-k
),验证其格式并提取焦距、主点坐标。如果提供了焦距值(-f
),直接使用该值。如果焦距未手动提供或无效,尝试从图像的EXIF元数据中读取焦距,并结合传感器宽度数据库计算焦距
根据指定的相机模型类型(e_User_camera_model
),创建相应的相机内参对象
根据图像的GPS信息和用户选项,决定是构建带有姿态先验的视图(ViewPriors
)还是普通视图(View
)。处理相机内参,确保每个视图都有对应的内参信息。将构建好的视图对象添加到SfM数据结构中,为后续的三维重建流程做准备。
处理和保存处理过程中生成的sfm_data.json数据,并输出处理结果的报告。将处理过程中遇到的警告和错误信息输出到日志中。对相机内参进行分组:如果用户启用了分组功能,对相机内参进行分组,以提高后续三维重建的效率和稳定性。保存SfM数据:将处理后的视图和内参信息保存到一个JSON文件中,供后续的三维重建工具使用。提供详细的处理报告,帮助用户了解程序的执行结果。