ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenMVG 场景导出到 PMVS/CMVS 的稠密重建实战:从 sfm_data 到密集点云

OpenMVG 场景导出到 PMVS/CMVS 的稠密重建实战:从 sfm_data 到密集点云 计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载本篇技术指南讲解如何将 OpenMVG 的稀疏重建结果sfm_data.bin通过openMVG_main_openMVG2PMVS导出为 PMVS/CMVS 可直接消费的工程目录图像、投影矩阵、pmvs_options.txt并串联 PMVS 与 CMVS 完成场景稠密点云重建。读完本文你将掌握导出器的全部命令行参数、输出文件结构、pmvs_options.txt各配置行的含义以及大型场景下基于 Bundler 格式的 CMVS 聚类工作流。OpenMVG 与 MVS 的分工为什么需要导出器OpenMVG 是一套开源的 Multiple View Geometry 库其核心职责是解决 Structure from MotionSfM问题从图像、内参和跨图像的几何有效特征中为每张图像估计相机位姿运动并生成稀疏三维点云结构。而稠密重建对场景生成稠密点云或网格表面属于 Multiple View StereovisionMVS的范畴。正如 MVS.rst 所述OpenMVG 自身并不包含 MVS 模块而是提供面向多种成熟 MVS 方案的导出器包括 Agisoft Photoscan、CMPMVS、MVE、OpenMVS、PMVS 与 Colmap。本文聚焦其中与 PMVS/CMVS 对接的导出器。在 SfM 阶段官方建议采用三目录数据组织方式见 SfM.rstimages图像序列、matches特征与匹配信息、outReconstructionSfM 结果与日志。SfM 求解完成后outReconstruction目录中即包含本文导出器的输入sfm_data.bin。上图即为 PMVS 在 OpenMVG 估计的相机位姿之上对一栋欧式建筑场景进行面片级稠密重建后输出的点云左右两个视角展示了建筑立面细节门窗轮廓、屋顶构件的完整几何还原。openMVG2PMVS 导出器命令与参数在完成 3D 标定即 SfM 求解之后将 SfM 输出文件转换为 PMVS 工程。导出器位于 src/software/SfM/export/main_openMVG2PMVS.cpp构建目标名为openMVG_main_openMVG2PMVS。$ openMVG_main_openMVG2PMVS -i Dataset/outReconstruction/sfm_data.bin -o Dataset/outReconstruction导出器支持的命令行参数由cmdLine库解析默认值见 main 函数参数长选项含义默认值-i--sfmdata待转换的 SfM_Data 文件路径必填无-o--outdir输出目录路径PMVS 工程将写入该目录下的PMVS/子目录空-r--resolution图像降采样系数divide image coefficient1-c--nb core写入pmvs_options.txt的 CPU 核数8-v--useVisData是否使用可见性信息生成vis.dattrue-r对应pmvs_options.txt中的level行用于控制 PMVS 在图像金字塔哪一层进行匹配-c控制 PMVS 使用的并行线程数。若省略全部参数直接运行程序会打印上述用法说明并返回失败。程序加载sfm_data.bin时使用Load(sfm_data, sSfM_Data_Filename, ESfM_Data(ALL))读取全部数据视图、内参、姿态、地标随后依次调用exportToPMVSFormat与exportToBundlerFormat两个导出函数见 main 函数主体。导出产物结构PMVS 工程目录详解运行导出器后输出目录下会生成PMVS/子目录其内部结构由exportToPMVSFormat创建见 目录创建逻辑Dataset/outReconstruction/ └── PMVS/ ├── models/ # 空目录PMVS 将把生成的稠密模型写入此处 ├── txt/ # 每张视图一张投影矩阵文件00000000.txt ... ├── visualize/ # 与投影矩阵对应的去畸变图像00000000.jpg ... ├── pmvs_options.txt # PMVS 运行参数文件 ├── vis.dat # 可见性信息仅当 -v 为 true 时生成 ├── bundle.rd.out # Bundler 格式的相机参数与稀疏点云供 CMVS 使用 └── list.txt # Bundler 格式的图像列表供 CMVS 使用txt/每视图的投影矩阵PMVS 要求相机索引连续而 OpenMVG 场景中部分视图可能缺少姿态。为此导出器建立一个map_viewIdToContiguous映射将视图 ID 重新索引为从 0 开始的连续编号见 视图重索引逻辑。对每个姿态与内参均有效的视图通过内参对象的get_projective_equivalent(pose)计算 3×4 投影矩阵P并以 8 位补零编号写入txt/00000000.txtCONTOUR P.row(0) P.row(1) P.row(2)文件首行为CONTOUR标记其后三行即投影矩阵P的三行该格式与 PMVS 的txt输入约定一致。visualize/去畸变后的输入图像对每张有效视图导出器将源图像输出为visualize/00000000.jpg编号与txt/文件一一对应。其处理逻辑见 图像导出代码取决于相机是否带畸变若相机存在畸变cam-have_disto()则先ReadImage读取原始图像再调用UndistortImage(image, cam, image_ud, BLACK)进行去畸变最后写出jpg若相机无畸变且源图已是JPG/jpg扩展名则直接stlplus::file_copy复制避免重复编码其他情况则读取后重新写出为jpg。pmvs_options.txtPMVS 运行配置导出器自动生成pmvs_options.txt其内容与默认值见 选项生成代码level 1 # 图像金字塔层级由 -r 指定1 表示原始分辨率 csize 2 # 单元cell尺寸 threshold 0.7 # 面片匹配的归一化相关阈值 wsize 7 # 匹配窗口大小 minImageNum 3 # 每个面片至少可见的图像数 CPU 8 # 并行线程数由 -c 指定 setEdge 0 # 是否使用图像边缘信息 useBound 0 # 是否使用边界约束 useVisData 1 # 是否使用 vis.dat 可见性信息由 -v 指定 sequence -1 # 图像序列模式-1 表示非序列图像 maxAngle 10 # 面片法向与视线夹角的最大容忍度 quad 2.0 # 面片二次项权重 timages -1 0 N # 目标图像范围-1 表示全部N 为有效视图总数 oimages 0 # 其他可选图像数其中timages行的N由map_viewIdToContiguous.size()动态计算即导出器实际写出的有效视图数量保证 PMVS 只处理有姿态的图像。vis.dat由稀疏点云观测导出的可见性图当-v/useVisData为真时导出器还会生成vis.dat。其数据来源并非匹配文件而是SfM 稀疏点云的观测关系遍历sfm_data.GetLandmarks()中的每个三维地标对其obs观测集合中的每一对视点两两组合记录哪些视图共同观测过同一点构建对称的view_shared邻接表见 可见性构建代码。输出格式为VISDATA #images viewId numSharedViews viewId1 viewId2 ...vis.dat帮助 PMVS 优先在共同可见的图像间做面片扩张能显著提升匹配效率与稠密重建质量。运行 PMVS 完成稠密重建导出完成后即可在PMVS/工程目录内直接调用 PMVS 可执行文件以项目根为当前目录参数为工程目录路径与选项文件名$ pmvs Dataset/outReconstruction/PMVS/ pmvs_options.txtPMVS 会读取txt/中的投影矩阵、visualize/中的图像以及pmvs_options.txt及可选的vis.dat执行面片匹配、扩张与滤波最终把稠密模型写入PMVS/models/目录。大型场景使用 CMVS 聚类重建对于大场景PMVS 的全对匹配代价过高。此时可使用 CMVSClustering Views for MVS先把视图聚成若干子簇再对每个簇独立运行 PMVS。由于 CMVS 消费的是 Bundler 输出格式而exportToBundlerFormat已同步导出bundle.rd.out与list.txt因此可直接衔接原文档给出的完整命令链$ openMVG_main_openMVG2PMVS -i Dataset/outReconstruction/sfm_data.bin -o Dataset/outReconstruction $ cmvs Dataset/outReconstruction/PMVS/ [MaxImageCountByCluster100] $ cmvs Dataset/outReconstruction/PMVS/ 30 $ genOption Dataset/outReconstruction/PMVS/ $ sh Dataset/outReconstruction/PMVS/pmvs.sh命令链说明cmvs Dataset/outReconstruction/PMVS/ [MaxImageCountByCluster100]指定每簇最大图像数示例为 100CMVS 读取bundle.rd.out与list.txt进行聚类第二条cmvs ... 30演示了将每簇图像数收紧到 30 的用法genOption Dataset/outReconstruction/PMVS/为每个聚类生成对应的 PMVS 运行选项与脚本sh Dataset/outReconstruction/PMVS/pmvs.sh批量执行各簇的 PMVS 稠密重建。Bundler 导出格式的实现要点exportToBundlerFormat见 导出实现输出# Bundle file v0.3头随后是视图数 × 稀疏地标数每视图写focal k1 k2、旋转矩阵R与平移t每地标写三维坐标X、颜色与观测列表视图索引、特征 ID、像点坐标。值得注意的是其中的坐标系转换导出时通过对角矩阵D diag(1, -1, -1)将 OpenMVG 的针孔相机约定映射为 Bundler 约定见 R/t 转换同时畸变系数固定写为 0因为图像已去畸变。若视图相机类型不是针孔模型导出会以Unsupported camera model for Bundler export.报错返回。构建与集成导出器是 OpenMVG 软件层的一部分其构建与安装规则见 src/software/SfM/export/CMakeLists.txt目标openMVG_main_openMVG2PMVS链接openMVG_system、openMVG_image、openMVG_features、openMVG_sfm及STLPLUS_LIBRARY并install(TARGETS ... DESTINATION bin/)安装到bin/目录。构建整个 OpenMVG 后可执行文件即位于构建/安装目录的bin/下。完整工作流串联从图像到稠密点云将本文内容放回 OpenMVG 的整体流水线中一条典型的稀疏到稠密路径为图像清单openMVG_main_SfMInit_ImageListing生成sfm_data.json与视图信息特征提取openMVG_main_ComputeFeatures如 SIFT得到特征与描述子匹配计算openMVG_main_ComputeMatches得到两两图像对应关系SfM 求解openMVG_main_SfM输出outReconstruction/sfm_data.bin稀疏点云 相机姿态参见 SfM 四步流水线导出openMVG_main_openMVG2PMVS -i .../sfm_data.bin -o .../outReconstruction稠密重建小场景直接pmvs .../PMVS/ pmvs_options.txt大场景走cmvs → genOption → sh pmvs.sh聚类重建。由此OpenMVG 的稀疏 SfM 结果即可无缝注入 PMVS/CMVS获得可用于可视化、测量或后续网格化的稠密场景点云。赞分享计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载相关推荐OpenMVG MVS 稠密重建生态指南从稀疏 SfM 到点云与网格的六路导出实战OpenMVG MVS 稠密重建生态指南从稀疏 SfM 到点云与网格的六路导出实战 OpenMVG 负责运动恢复结构SfM中的稀疏重建——估计相机位姿与稀计算机视觉科研SLAM3R实时 RGB 视频的稠密场景重建SLAM3R实时 RGB 视频的稠密场景重建 项目介绍 SLAM3R 是一个实时稠密场景重建系统它通过前向传播神经网络从视频帧回归 3D 点而无需显式估计人工智能计算机视觉深度学习科研三维重建质量评估实战从稀疏点云到稠密模型的技术探索三维重建质量评估实战从稀疏点云到稠密模型的技术探索 作为计算机视觉领域的技术探索者我常常被问及如何客观评价3D重建结果的质量。经过多个项目的实践验证我发现计算机视觉图形学图像处理上一篇700亿参数模型秒级响应Groq极速AI服务全攻略下一篇解锁语音交互新体验Semantic Kernel中的Azure OpenAI音频功能全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表