总体技术思路
自动化三维重建是指通过计算机视觉、摄影测量学和计算几何等技术,自动地从一组无人机倾斜摄影测量图像中创建出精确的三维模型的过程。具体包括数据采集与预处理、COLMAP稀疏重建、COLMAP密集重建、地理配准与格式转换、COLMAP泊松格网重建、纹理贴图和3dtiles切片几个步骤。
- 数据采集与预处理:使用无人机进行多角度拍摄,获取高分辨率的图像数据,并通过特征提取和匹配准备用于三维重建的数据集 COLMAP
- 稀疏重建:基于上一阶段生成的特征点匹配结果,初步恢复场景的三维结构,包括估计每个相机的位置和方向、生成稀疏点云,以及记录图像与相机间的关联信息。
- COLMAP 密集重建: 利用稀疏重建的结果进一步细化,生成更详细的稠密点云。
- 地理配准与格式转换:为了使生成的三维模型能够在真实世界坐标系中准确表示,需要对其进行地理配准。这一步骤确保了模型的位置、大小和方向都符合实际情况。完成地理配准后,将点云模型转换为其他通用格式(.las),便于跨平台共享和使用。
- COLMAP泊松格网重建:利用COLMAP对地理配准后的点云文件进行泊松格网重建处理,通过计算泊松方程的方法将三维点云模型重建为具有三角格网表面的mesh模型
- 纹理贴图:利用MeshLab对三维格网的mesh模型的表面进行处理,展开成二维平面,创建UV坐标,并将纹理图像应用到相应的UV坐标上,以实现预期的视觉效果,结果导出为.obj格式文件和.png格式的纹理贴图
- 3dtiles切片:使用cesiumLab或者obj2tiles工具分别对泊松密集点云.las文件和带有纹理贴图的三维格网建模.obj文件进行3dtiles切片处理,最终得到.pnts集合的点云3dtiles切片和.b3dm集合的三维重建模型的3dtiles切片模型
工具部署、数据采集与预处理
(1)无人机倾斜摄影数据集的采集和预处理
- 影像数据集的采集:
①最好使用大疆无人机进行拍摄,至少应从三个独特(但并非截然不同)的视角拍摄被摄体的每个部分。连续影像的重叠区域通常应超过 2/3。同一物体部分的不同视角之间应保持 15 度以下的夹角。
②对于物件建模,在物体周围拍摄大约 30-50 幅间隔均匀的影像
③对于场景建模,建议纵向重叠率和横向重叠率分别不低于 80% 和 50%。
④无人机拍摄的照片必须附带拍摄GPS的EXIF信息,只有具有该信息的影像集才可以才后续的地理配准环境为三维模型附上地理位置。
- 影像数据集的预处理
COLMAP 提供了内置的畸变校正(undistortion)处理功能,这对于准备用于多视图立体匹配(MVS)的数据集尤为重要。通过畸变校正,可以生成无畸变的图像,这些图像更适合进行后续的密集重建等操作
(2)COLMAP在服务器上的部署
COLMAP 是一个通用的Structure-from-Motion (SfM) 和 Multi-View Stereo (MVS) 管道,提供了图形界面和命令行接口,支持有序或无序图像集合的重建。
参考链接:https://blog.csdn.net/xm_1139164554/article/details/134581359
注意:我的服务器为centos操作系统,因此只能通过源码安装的方式对colmap进行安装部署
参考这个链接 Colmap在centos7下的编译
主要步骤为:
- 1、安装GPU驱动CUDA 和 CUDNN
- 2、编译环境准备
GCC升级 需要将GCC升级到5.4版本,以满足COLMAP的编译需求。这包括下载、解压源码,配置编译选项,并执行make与make install进行编译安装。 基础包安装 使用yum命令安装一系列基础库,如cmake、build-essential等,为后续软件包的编译提供必要的开发工具和库文件。 第三方库安装 包括Boost、gflags、glog、FreeImage和Ceres Solver在内的多个第三方库需要单独下载、编译并安装。每个库都有特定的安装步骤和注意事项,比如使用./bootstrap.sh初始化Boost的编译过程,对于gflags则通过cmake来构建动态链接库等。
- 3、COLMAP的编译与安装
最后一步是从GitHub下载COLMAP源码,并创建构建目录。通过cmake …生成Makefile文件,然后运行make进行编译,最终完成COLMAP的安装。
mkdir build
cd build
cmake ..
# For CentOS users, use following command.
# CentOS ships BOOST lib only with shared lib.
# cmake .. -DBOOST_STATIC=OFF
make -j16
make intall
这些命令行用于编译一个软件项目,通常是从源代码开始构建软件。下面是对每个命令的解释:
mkdir build
- 这个命令创建了一个名为 build 的新目录。在软件开发中,通常会使用一个独立的目录来存放编译过程中生成的文件(如目标文件、可执行文件等),以保持源代码目录的清洁。
cd build
- 改变当前工作目录到刚刚创建的 build 目录。这样做的目的是在这个目录下进行所有的编译活动,而不是直接在源码目录中操作。
cmake ..
- CMake 是一个跨平台的构建系统生成器。这个命令告诉 CMake 从上一级目录(即包含 CMakeLists.txt 文件的目录)读取配置,并根据这些配置为当前目录生成本地构建文件(例如,在 Unix 系统上可能是 Makefile)。.. 表示 CMake 应该在父目录中寻找 CMakeLists.txt 文件。
- 对于 CentOS 用户,注释中的建议是如果遇到问题可以添加 -DBOOST_STATIC=OFF 参数,这是因为 CentOS 默认提供的 Boost 库只有共享库版本,而没有静态库版本。通过设置 -DBOOST_STATIC=OFF,可以让 CMake 配置项目时只链接共享库版本的 Boost。
make -j16
- 这里的 -j16 告诉 make 工具并行运行最多 16 个任务(jobs)。这有助于加快编译过程,尤其是在多核处理器上。
make install
- 这个命令执行安装步骤。它将根据 Makefile 中定义的规则,复制二进制文件、库文件、配置文件等必要的组件到系统的相应位置(比如 /usr/local/bin 或者 /usr/local/lib),以便可以在系统范围内使用该软件。通常需要适当的权限(如 root 权限)才能成功执行此命令,因此你可能需要用 sudo make install 来运行它。
COLMAP实现三维重建
COLMAP 进行三维重建的详细流程,包括 GUI 和命令行两种方式
(1)使用 GUI 进行三维重建
注意:一般服务器没有gui界面的,但三维建模最好使用gui界面可以进行更好的结果查看 一般使用CentOS 7 安装GNOME的方法来创造GUI界面环境 然后使用VNC工具进行桌面gui环境的链接
最终服务器自带的结果界面如下所示:
准备工程目录
- 创建一个新的项目文件夹,并在其中创建 images 文件夹来存放要进行重建的图片。
启动 COLMAP 并加载图像
- 打开 COLMAP 的图形界面。
- 通过菜单选择 File -> New Project,然后指定数据库文件路径和图片文件夹路径。
特征提取
- 在 Processing 菜单下选择 Feature Extraction 来开始特征点检测。此步骤会在每张图片中找到关键点并生成描述子。
特征匹配
- 接着选择 Feature Matching 来将不同图片中的特征点进行匹配。这一步会生成匹配矩阵,即不同视图之间同名特征的数量作为权重的图结构。
稀疏重建
- 在 Reconstruction 菜单下点击 Start Reconstruction 开始增量式建模过程。这个过程包括相机姿态估计、三角化以及全局优化等步骤,最终生成稀疏点云模型。
稠密重建
- 稀疏重建完成后,可以进一步进行稠密重建。在 Reconstruction 菜单下选择 Dense Reconstruction,并选择保存数据的文件夹。
7. 结果查看与导出
- 重建完成后,可以在 COLMAP 中查看结果,并通过 Export 功能将模型导出为常见格式如 .ply 或 .obj。
(2)使用命令行进行三维重建
准备工程目录
- 同样需要创建一个包含 images 文件夹的项目文件夹。
特征提取
- 使用以下命令执行特征提取:colmap feature_extractor –database_path $DATASET_PATH/database.db –image_path $DATASET_PATH/images
特征匹配
- 根据图像数量选择合适的匹配策略,例如穷尽匹配(适用于少量图像)、序列匹配或空间匹配等。这里以穷尽匹配为例:colmap exhaustive_matcher –database_path $DATASET_PATH/database.db
稀疏重建
- 执行稀疏重建:mkdir $DATASET_PATH/sparse
colmap mapper –database_path $DATASET_PATH/database.db –image_path $DATASET_PATH/images –output_path $DATASET_PATH/sparse
稠密重建
- 对原始图像去畸变:mkdir $DATASET_PATH/dense
colmap image_undistorter –image_path $DATASET_PATH/images –input_path $DATASET_PATH/sparse/0 –output_path $DATASET_PATH/dense –output_type COLMAP –max_image_size 2000 - 执行稠密重建:colmap patch_match_stereo –workspace_path $DATASET_PATH/dense –workspace_format COLMAP –PatchMatchStereo.geom_consistency true
- 融合深度信息形成稠密点云:colmap stereo_fusion –workspace_path $DATASET_PATH/dense –workspace_format COLMAP –input_type geometric –output_path $DATASET_PATH/dense/fused.ply
表面重建
- 可选地,可以使用泊松曲面重建或狄洛尼三角网重建方法生成表面网格:colmap poisson_mesher –input_path $DATASET_PATH/dense/fused.ply –output_path $DATASET_PATH/dense/meshed-poisson.ply
无论是通过 GUI 还是命令行,COLMAP 都提供了一套完整的流程来进行三维重建,从特征提取到稠密重建再到表面重建,每个阶段都有相应的参数调整空间,可以根据具体需求进行优化。
地理配准与格式转换
地理配准
参考链接:colmap笔记:将模型和影像位姿转换到GPS坐标系下
默认情况下,COLMAP 生成的模型是基于局部坐标系的,这意味着它们没有地理参考信息。为了将这些模型转换到基于 GPS 的全球坐标系下,可以使用 COLMAP 提供的 model_aligner 工具
- 步骤一:准备数据
确保你的图像文件包含 EXIF 数据,特别是 GPS 位置信息。COLMAP 可以自动读取这些信息,但如果你的数据不包含这些信息,你需要手动提供一个包含图像名称及其对应 GPS 坐标的列表文件。
- 步骤二:运行 COLMAP 稀疏重建
首先,你需要完成 COLMAP 的稀疏重建过程,这会生成一个位于局部坐标系中的三维模型以及相机的姿态信息。
- 步骤三:使用 model_aligner 对齐模型
接下来,利用 model_aligner 工具来对齐模型。这个工具可以接受不同的参数设置,但基本命令如下所示:
colmap model_aligner –input_path /data/colmap_project/test_uav/dense/poission –output_path /data/colmap_project/test_uav/dense/poission/gps –database_path /data/colmap_project/test_uav/database.db –ref_is_gps 1 –alignment_type ecef –alignment_max_error 3.0
参数解释 –input_path: 指定了输入模型的路径,这里是 /data/colmap_project/test_uav/dense/poission。这个目录通常包含由 COLMAP 生成的稀疏或稠密重建结果,包括相机姿态(images.txt)、相机参数(cameras.txt)和点云数据(points3D.txt)等文件。 –output_path: 指定了输出路径,即对齐后的模型将会被保存在这个位置:/data/colmap_project/test_uav/dense/poission/gps。这里会生成新的相机姿态、相机参数和点云数据文件,它们已经被转换到了指定的坐标系中。 –database_path: 提供了包含图像元数据的数据库文件路径,这里是 /data/colmap_project/test_uav/database.db。这个数据库包含了特征匹配信息和其他与图像相关的信息,对于某些类型的对齐操作可能是必需的。 –ref_is_gps: 设置为 1 表示所提供的参考坐标是 GPS 坐标。这意味着在进行对齐时,model_aligner 将尝试使用这些 GPS 数据作为参考来调整模型的位置和方向。 –alignment_type: 定义了要使用的坐标转换类型,在这个例子中设置为 ecef,即地球中心地固坐标系(Earth-Centered, Earth-Fixed)。这是一种全球坐标系统,适用于需要精确地理位置的应用场景。 –alignment_max_error: 设置了用于鲁棒对齐的最大误差阈值,单位为米。在这个例子中设置为 3.0 米。这个参数控制了 RANSAC 算法在寻找最佳变换时允许的最大偏差值,有助于过滤掉可能存在的异常值或不准确的数据点。
注意:model_aligner处理的点云文件必须拥有完整相机信息images.txt和camera.txt文件,也就是这两个文件不能为空,但poission重建得到的点云没有images.txt和camera.txt文件信息
解决办法:将稀疏重建得到的点云文件由.bin格式转化为.txt格式,然后将稀疏点云得到images.txt和camera.txt文件代替poission重建导出点云的images.txt和camera.txt文件,再对poission重建导出的点云进行model_aligner 对齐操作
最终得到gps实际地理坐标下的泊松重建模型
参考信息:colmap生成的三个txt文件:camera.txt image.txt和point3D.txt
cameras.txt
这个文件包含了数据集中所有重建相机的内在参数(即相机内参),每个相机占一行。每一行的数据结构如下:
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# 相机ID, 相机模型, 宽度, 高度, 参数数组
例如:
1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
这里的参数根据不同的相机模型而有所不同,比如 SIMPLE_PINHOLE 模型需要焦距和主点坐标作为参数。
images.txt
该文件包含了数据集中所有重建图像的姿态(位姿)和关键点,每张图像占两行。第一行包含图像的姿态信息和相机ID及名称,第二行则是与该图像关联的关键点及其对应的三维点ID。每一行的数据结构如下:
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
例如:
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
这里使用四元数 (QW, QX, QY, QZ) 和平移向量 (TX, TY, TZ) 来表示图像的姿态,而 (X, Y, POINT3D_ID) 则是图像上的二维特征点及其对应三维点的ID 。
points3D.txt
该文件包含了数据集中所有重建的三维点的信息,每个点占一行。每一行的数据结构如下:
# 3D point list with one line of data per point:
# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
例如:
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227 63376
这里包含了三维点的坐标 (X, Y, Z)、颜色信息 (R, G, B)、重投影误差 ERROR 以及该点出现在哪些图像中的记录 TRACK[],即图像ID和在图像中的二维点索引 。
格式转换
CloudCompare是一款开源的三维点云(和三角形网格)处理软件
CloudCompare是使用C++开发的,用户界面基于Qt,图形渲染使用OpenGL。它可以在Windows、MacOS和Linux操作系统上运行,并且支持32位和64位体系结构。由于其高效的算法实现和良好的架构设计,CloudCompare能够在标准笔记本电脑上处理大规模的点云——通常超过1000万个点
注意:要将通过泊松重建得到的 .ply 文件转换为 .las 文件,其中在导入.ply文件时选择yes to all选项,要不在转化的时候会导致.las文件的三维地理坐标出错
转换后在cesiumlab中设置空间参考为EPSG:4978即可得到点云的三位切片模型,并可以加载在地球上 EPSG:4978
EPSG:4978 是基于WGS 84参考椭球的地心地固直角坐标系(Earth-Centered, Earth-Fixed, ECEF),即colmap地理配准后三维模型自带的坐标信息,它是一种三维笛卡尔坐标系,用于表示地球表面或其上方/下方点的位置。在这种坐标系中,地球被视为一个完美的旋转椭球体,并且坐标系的原点位于地球的质量中心(质心)。
具体来说,EPSG:4978 坐标系具有以下特征:
- 原点:地球的质心。
- X轴:延伸通过本初子午线(0度经线)和赤道(0度纬线)的交点。
- Y轴:与X轴垂直且位于赤道平面内,指向东经90度的方向。
- Z轴:延伸通过北极,即与地球的自转轴重合。
与EPSG:4326的转换关系:
COLMAP泊松格网重建
这里其实colmap已经对稠密三维点云(fused.ply)文件进行了泊松三维格网的重建了,但是这个重建的mesh模型没有真实的地理信息,准确说是有相机的位置姿态信息,只是没有地理位置和大小缩放信息
– 解决地理位置信息可以在obj2tiles工具进行3dtiles切片时自动设置
/home/sy_cmsr/obj2tiles/Obj2Tiles /data/colmap_project/obj/colmap_uav/texture/texture.obj /data/colmap_project/obj/colmap_uav/texture/3dtiles –lat 30.448310 –lon 114.576916 –alt 17.670332
– 解决大小缩放信息需要借助meshlab和Cloudcompare工具联合解决
1、首先在Cloudcompare中使用mesh工具对真实地理坐标下泊松重建后的三维点云进行格网化处理 得到三维mesh模型的粗糙模型(粗糙模型就够了,因为精细模型colmap已经建好了,我只需要得到两者的大小缩放关系即可)
2、在Cloudcompare中使用使用测量工具分别量测地理配置后的mesh模型和精细的meshed-poission模型多个地理建筑体的距离,量测多个距离后取平均值可以得到地理配置后的mesh模型和精细的meshed-poission模型间的缩放关系。
例如8.409/0.658=12.78 缩放关系大致在12.78上下的区间里面
3、在meshlab中对精细的meshed-poission模型进行缩放出来,主要是使用transform:Scale,Normalize工具处理,,即可得到正常缩放大小下的mesh三维格网模型
三维mesh格网模型 meshed-poisson-transform.ply文件
meshlab纹理贴图
.obj三维纹理贴图文件需要的文件结构:
- 获取模型文件:确保你有一个包含纹理坐标信息的模型文件(例如.obj)。这个文件应该已经包含了顶点(v)、纹理坐标(vt)、法线(vn)以及面片(f)的信息,并且这些信息正确地引用了材质文件。
- 材质文件:如果你的模型使用了材质,你需要一个对应的.mtl文件。该文件定义了材质属性,包括颜色、透明度等,并指定了用于渲染的纹理图像文件名。
- 纹理图像:准备好你的纹理图像文件(通常是.png或.jpg格式),并确保其路径与.mtl文件中的指定相匹配。
1、参数化(Parameterization) 这一步是为了创建UV坐标,将三维平面转为二维平面, 使其可以将mesh文件的颜色附着在UV坐标上形成纹理图片
2、纹理投影
这里可以设置纹理投影图片的像素大小
![
3、导出为.obj文件
3dtiles切片处理
注意利用obj2tiles工具进行处理
源码链接:Obj2Tiles
命令行参数:
Input (pos. 0) Required. Input OBJ file.
Output (pos. 1) Required. Output folder.
-s, –stage (Default: Tiling) Stage to stop at (Decimation, Splitting, Tiling)
-l, –lods (Default: 3) How many levels of details
-d, –divisions (Default: 2) How many tiles divisions
-z, –zsplit (Default: false) Splits along z-axis too
-k, –keeptextures (Default: false) Keeps original textures
–lat Latitude of the mesh
–lon Longitude of the mesh
–alt (Default: 0) Altitude of the mesh (meters)
-e, –error (Default: 100), baseError value for root node
–scale (Default: 1), scale for data if using units other than meters ( 1200.0/3937.0 for survey ft)
–y-up-to-z-up (Default: false) Converts Y-up to Z-up
–use-system-temp (Default: false) Uses the system temp folder
–keep-intermediate (Default: false) Keeps the intermediate files (do not cleanup)
–help Display this help screen.
–version Display version information.
为了增加 Levels of Detail (LOD) 的层级数量,你可以使用 -l 或 –lods 参数来指定你希望生成的 LOD 层级数量。默认情况下,这个值是 3。下面是对命令中各个参数含义的说明,以及如何设置更多的 LOD 层级。
参数解释
-
Input (pos. 0): 必须提供的输入 OBJ 文件路径。
-
Output (pos. 1): 输出文件夹路径,用于存放转换后的 3D Tiles 数据。
-
-s, –stage: 设置处理过程停止的阶段。可选项包括 Decimation(简化)、Splitting(分割)和 Tiling(瓦片化)。默认是 Tiling。
-
-l, –lods: 设置细节层次(LOD)的数量。如果你想增加 LOD 层级,可以通过此参数调整。例如,若要设置为5级LOD,则使用 -l 5。
-
-d, –divisions: 设置每个 LOD 层级中的分割数。更高的数值意味着更细的分割,但也会消耗更多内存和处理时间。默认值为2。
-
-z, –zsplit: 是否沿Z轴进行分割。默认是 false。如果模型需要在高度方向上有更细致的划分,可以设为 true。
-
-k, –keeptextures: 是否保留原始纹理。默认是 false。如果你想要保持原始材质和纹理,可以设为 true。
-
–lat: 模型放置的纬度坐标。
-
–lon: 模型放置的经度坐标。
-
–alt: 模型放置的海拔高度,默认是0米。
-
-e, –error: 根节点的基础误差值(baseError),影响LOD分辨率。较低的误差值会使得模型在更大的距离上保持更高的分辨率。默认值为100。
-
–scale: 如果使用的单位不是米,可通过此参数调整比例。例如,对于测量英尺,可以使用 1200.0/3937.0。
-
–y-up-to-z-up: 是否将Y向上坐标系转换为Z向上坐标系。默认是 false。
-
–use-system-temp: 是否使用系统的临时文件夹存储中间数据。默认是 false。
-
–keep-intermediate: 是否保留处理过程中产生的中间文件而不清理。默认是 false。这有助于调试,但会占用更多磁盘空间。
调整其他参数以优化性能
- 如果发现内存不足或处理速度慢,可以考虑减少 -l和-d 参数的值(例如从默认的2降低到1),这将减少LOD的层级和每个LOD层级的细分数量,从而降低内存使用和计算复杂度。
- 同时,适当调整 -e 参数的基础误差值也可以帮助平衡LOD之间的平滑过渡与性能之间的关系。
通过这些参数的调整,你可以根据自己的需求优化输出的3D Tiles数据集,无论是为了更好的视觉效果还是为了适应硬件资源限制。如果有特定的需求或遇到问题,请提供更多信息以便进一步帮助。
最终在cesiumlab中加载3dtiles切片模型的效果
评论前必须登录!
注册