AliceVision:命令行摄影测量

您是否需要自动化大量的摄影测量扫描? 那我对你有个好消息。


该视频显示了开源的Meshroom摄影测量程序。 这个项目已经以各种形式存在了一段时间,但是最近开发人员已经发布了二进制文件,因此您可以简单地下载和使用它们。 该视频演示了如何使用GUI加载图像,处理图像,更改参数等。 我建议您尝试使用该程序。

但是我对完全自动化感兴趣。 如果您有一个扫描安装程序,每天要进行100次或更多次扫描,则需要一个全自动解决方案来批量处理这些文件。 这篇文章是解决此问题的指南和/或教程。

对于初学者来说,重要的是要了解Meshroom不是一个庞大的整体项目。 实际上,处理本身是由从命令行运行的单独的C ++程序执行的, Meshroom是执行适当调用的瘦Python编码程序。 因此,我们将直接使用这些程序,而不是使用Meshroom 。 请注意,完整的源代码可用,因此您可以直接链接库。

Meshroom的另一个便利功能是:在每次操作期间,其命令都显示在终端中。 因此,为了创建此过程的各个阶段,我只是与Meshroom合作,并考察了团队。 然后我查看了代码以更改一些参数。 另外,似乎在启动Meshroom时,可以命令它从命令行收集一组图像,但是我不希望连接这些步骤。

准备和安装


0:要求

Meshroom / AliceVision不会在所有平台上运行。 一些步骤需要CUDA,因此要构建深度图,您将需要NVIDIA GPU。 不幸的是,不可能使用CPU后备(将GPU功能的执行转移到CPU),否则,该程序在Windows和Linux上也可以正常工作。 本文中的说明适用于Windows,但只需进行很少的更改,即可针对Linux进行微调。

1:下载Meshroom版本

网格房2018.1.0

首先要做的是安装Meshroom 。 选择您要从中进行工作的文件夹,然后下载最新版本。 该zip文件包含所有依赖项的二进制文件。

如果您喜欢冒险,可以尝试自己组装程序。 发布动态链接库工作正常(/ MD),但是我不得不破解cmake文件来创建调试版本和/或静态链接版本。 如果要在Windows下构建程序,则极力推荐使用VCPKG。

2:下载数据

alicevision / dataset_monstree

显然,摄影测量软件的要点是处理您自己的图像,但首先我建议您使用适合的图像。 如果出现问题,它们将使您找到问题的根源。 幸运的是,开发人员为其测试树发布了一组图像。

3:下载run_alicevision.py脚本

run_alicevision.zip

这是我们将使用的脚本。 只需下载zip文件并将其解压缩到您的工作文件夹中即可。

4:安装Python

https://www.python.org/download/releases/2.7/

如果尚未安装Python,请先安装。 是的,我仍在为Python 2.7.0编写代码。 从发行版安装Windows X86-64 MSI安装程序的最简单方法。

5:安装Meshlab(可选)

网格实验室

作为可选步骤,您还必须安装MeshLab 。 实际上,将不需要进行处理,但是在几个阶段中,数据会显示在PLY点文件中。 它们无法下载到Maya ,因此我使用MeshLab进行查看。

压缩所有文件后,该文件夹应如下所示(由脚本生成的build_files文件夹除外):



以下是:

  • build_files:我们已编译文件。
  • dataset_monstree-master:源图像
  • Meshroom-2018.1.0: Meshroom / AliceVision二进制文件
  • 其他所有内容:运行它们的脚本,该脚本取自run_alicevision.zip

启动AliceVision


现在是时候仔细看看run_alicevision.py

Python文件接收5个参数:

python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>

  1. baseDir :您要在其中放置临时文件的文件夹。
  2. imgDir :包含源图像的文件夹。 在我们的例子中, IMG_1024.JPG (及其他)。
  3. binDir :包含AliceVision可执行文件的文件夹,例如aliceVision_cameraInit.exe
  4. numImages :在我们的例子6中,为imgDir中的图像数。当然,您可以自动识别此数字,但是目标是创建尽可能简单的python脚本,因此您需要自己指定此数字。
  5. runStep :要执行的操作。

总结一下:我们从6张看起来像这样的图像开始:


使用run_alicevision.py python脚本我们将创建以下文件夹结构:


11_Texturing文件夹中,将在Meshlab中打开一个现成的模型:


这些文件夹中的每一个都是步骤之一。 我们可以使用run_monstree_runXX.bat文件依次运行它们,也可以使用run_monstree_all.bat一次收集它们。

仅此而已。 现在,您可以运行文件run_monstree_all.bat ,或一次执行一个步骤。 您可以查看脚本以了解其工作。 对于那些希望能够自定义处理管道的人,我准备了各个步骤的简介。

00_CameraInit

第一步将生成一个SFM文件。 SFM文件是JSON文件,用于存储相机大小,传感器信息,找到的3d点(观测值),失真因子和其他信息。 此文件夹中的初始SFM文件将仅包含有关传感器的信息,并从本地传感器数据库中选择默认值。 后续步骤将创建SFM文件,其中包含外部摄像机参数,点等的完整矩阵。

您可能需要配置此步骤。 如果您使用带有4个摄像机的设置,但要在转盘上旋转的物体拍摄10张照片,则您需要一个SFM文件,其中包含40张图像,但只有4种不同的传感器校准。 这就是为什么我喜欢AliceVision的结构的主要原因 。 在其中轻松设置批处理操作(例如,生成自己的SFM文件),而无需设置其他最好不要改动的软件元素。

01_FeatureExtraction

下一阶段从图像中提取特征特征,以及这些特征的描述符。 它将根据提取的特征类型更改文件扩展名。

02_ImageMatching

02_ImageMatching是一个后处理步骤,它确定哪些图像可以逻辑映射到彼此。 如果您有一组1000张图像,则要对所有1000张图像进行粗略搜索以匹配所有1000张图像,则需要100万对。 这会花费很多时间(实际上是一半,但是您了解原理)。 阶段02_ImageMatching切断了这些对。

03_FeatureMatching

03_FeatureMatching使用特征描述符匹配图像。 它生成的txt文件不需要解释。

04_StructureFromMotion

因此,这是第一个严肃的阶段。 基于04_StructureFromMotion对应关系, 它将计算摄像机的位置以及摄像机的内部参数。 应当注意,术语“从运动开始的结构”用作计算相机位置的通用术语。 如果您有10个同步摄像机的摄影测量设置,则即使没有真正移动,也可以使用“运动构造”来捕捉它们。

默认情况下, Meshroom将所有计算出的数据存储为Alembic文件,但我更喜欢将其存储在SFM文件中。 此阶段创建中间数据,以确保正确链接摄像机。 在输出中,脚本创建可以在Meshlab中查看的PLY文件。 以下文件很重要:

  • bundle.sfm:具有所有观察结果的SFM文件。
  • camera.fm:仅包含附加摄像机数据 SFM文件。
  • cloud_and_poses.ply:找到的点和摄像机。


这是cloud_and_poses.ply文件。 绿点是相机。 我认为这种格式最适合检查相机装订中是否没有严重错误。 如果某处发生错误,则可以返回并更改功能,对应关系或SFM参数。



05_PrepareDenseScene

05_PrepareDenseScene的主要任务是消除图像失真。 它生成没有失真的EXR图像,因此在计算深度和投影的后续步骤中,无需从失真函数执行往返转换。 图片如下所示:



请注意,您会看到黑色区域。 AliceVision的后续步骤不使用真实的相机矩阵。 取而代之的是,我们假设相机具有一个没有失真的新矩阵,并且05_PrepareDenseScene将原始图像变形为该虚拟矩阵。 由于此新的虚拟传感器大于实际传感器,因此某些区域将显示为空白(黑色)。

06_CameraConnection

严格来说,此阶段违反了我们工作流程的原则。 所有阶段的设计都使每个文件夹成为一个完全独特的单独阶段。 但是, 06_CameraConnection05_PrepareDenseScene文件夹中创建camsPairsMatrixFromSeeds.bin文件,因为此文件必须与图像位于同一文件夹中且不能变形。

07_DepthMap

这是AliceVision的最长阶段:生成深度图。 它为每个图像创建一个深度图作为EXR文件。 我对其进行设置以使其更容易注意到。 您会看到一个小的“舌头”从树上伸出来。


由于此阶段需要很多时间,因此有一个参数允许我们将不同摄像机的组作为不同的单独命令运行。 因此,如果您有1000个摄像机,则可以为不同农场计算机上的摄像机组创建深度图。 或者,您可以将工作分成几小组,这样一台计算机崩溃时,您无需再次重复整个过程。

08_DepthMapFilter

源深度图将不完全一致。 一些深度图将需要查看与其他深度图重叠的区域。 阶段08_DepthMapFilter隔离了这些区域并增强了深度一致性。


09_啮合

这是直接生成网格的第一步。 网格可能存在一些小问题,可以用...解决。


10_MeshFiltering

阶段10_MeshFiltering接收09_Meshing网格并对其进行优化 。 它执行以下操作:

  • 平滑网格。
  • 消除大三角形。
  • 保存最大的网格,但删除其余的网格。


其中某些操作在某些情况下并不总是理想的,因此可以根据需要调整参数。

11_纹理

最后阶段。 11_Texturing创建UV并投影纹理。 至此,一切都结束了!


您可以使用Meshlab做的最后一个技巧:可以将不同的OBJ和PLY文件拖放为图层。


在我的示例中,完成的网格和点/摄像机SFM都有一层。 有时,网格的平滑步骤可能会比必要时稍微激进一些,因此比较原始网格和平滑网格很有用。 如果网格看起来破裂,可以方便地使用来自PLY的sfm数据和来自OBJ的网格来跟踪管道中的问题。

致谢

没有AliceVisionOpenMVG的开发团队的帮助 ,这篇文章将不完整。 灵感来源是libmv项目。 这个项目是OpenMVG的前身, OpenMVG是计算机视觉工程师/研究人员用于开发新算法的存储库。 AliceVisionOpenMVG的分支,专门用于将这些算法转换为成品形式的独立解决方案。

AliceVision / Meshroom是一个雄心勃勃的大型开源项目。 他的主要成就是通过如此认真的项目完成了这样的最终项目,我们对他有很多贡献。 我们还要感谢OpenMVG团队(和libmv ),他们的基础工作使AliceVision得以创建

最后,我要特别感谢Microsoft的VCPKGVCPKG是一个程序包管理器,极大地简化了Windows大型开源项目的组装。 几年前,我尝试在Windows下构建OpenMVG 。 结局不是很好。 因此,几个月前,当我听说AliceVision时,我曾尝试对其进行编译,但即使使用简单的东西也失败了。 然后,我尝试了VCPKG ,一切都立即生效 。 很难量化使用VCPKG之类的项目的优势,但它确实为Windows的开源生态系统提供了帮助。

github.com/alicevision

github.com/openMVG/openMVG

github.com/libmv/libmv

github.com/Microsoft/vcpkg

Source: https://habr.com/ru/post/zh-CN422807/


All Articles