您是否需要自动化大量的摄影测量扫描? 那我对你有个好消息。
该视频显示了开源的
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:安装Pythonhttps://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.pyPython文件接收5个参数:
python run_alicevision.py <baseDir> <imgDir> <binDir> <numImages> <runStep>
- baseDir :您要在其中放置临时文件的文件夹。
- imgDir :包含源图像的文件夹。 在我们的例子中, IMG_1024.JPG (及其他)。
- binDir :包含AliceVision可执行文件的文件夹,例如aliceVision_cameraInit.exe 。
- numImages :在我们的例子6中,为imgDir中的图像数。当然,您可以自动识别此数字,但是目标是创建尽可能简单的python脚本,因此您需要自己指定此数字。
- 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_ImageMatching02_ImageMatching是一个后处理步骤,它确定哪些图像可以逻辑映射到彼此。 如果您有一组1000张图像,则要对所有1000张图像进行粗略搜索以匹配所有1000张图像,则需要100万对。 这会花费很多时间(实际上是一半,但是您了解原理)。 阶段
02_ImageMatching切断了这些对。
03_FeatureMatching03_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_PrepareDenseScene05_PrepareDenseScene的主要任务是消除图像失真。 它生成没有失真的EXR图像,因此在计算深度和投影的后续步骤中,无需从失真函数执行往返转换。 图片如下所示:
请注意,您会看到黑色区域。
AliceVision的后续步骤不使用真实的相机矩阵。 取而代之的是,我们假设相机具有一个没有失真的新矩阵,并且
05_PrepareDenseScene将原始图像变形为该虚拟矩阵。 由于此新的虚拟传感器大于实际传感器,因此某些区域将显示为空白(黑色)。
06_CameraConnection严格来说,此阶段违反了我们工作流程的原则。 所有阶段的设计都使每个文件夹成为一个完全独特的单独阶段。 但是,
06_CameraConnection在
05_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的网格来跟踪管道中的问题。
致谢没有
AliceVision和
OpenMVG的开发团队的
帮助 ,这篇文章将不完整。 灵感来源是
libmv项目。 这个项目是
OpenMVG的前身,
OpenMVG是计算机视觉工程师/研究人员用于开发新算法的存储库。
AliceVision是
OpenMVG的分支,专门用于将这些算法转换为成品形式的独立解决方案。
AliceVision / Meshroom是一个雄心勃勃的大型开源项目。 他的主要成就是通过如此认真的项目完成了这样的最终项目,我们对他有很多贡献。 我们还要感谢
OpenMVG团队(和
libmv ),他们的基础工作使
AliceVision得以
创建 。
最后,我要特别感谢Microsoft的
VCPKG 。
VCPKG是一个程序包管理器,极大地简化了Windows大型开源项目的组装。 几年前,我尝试在Windows下构建
OpenMVG 。 结局不是很好。 因此,几个月前,当我听说
AliceVision时,我曾尝试对其进行编译,但即使使用简单的东西也失败了。 然后,我尝试了
VCPKG ,一切都
立即生效 。 很难量化使用
VCPKG之类的项目的优势,但它确实为Windows的开源生态系统提供了帮助。
github.com/alicevisiongithub.com/openMVG/openMVGgithub.com/libmv/libmvgithub.com/Microsoft/vcpkg