qidao123.com技术社区-IT企服评测·应用市场

标题: 使用服务器联合COLMAP方案实现自动化快速三维重修 [打印本页]

作者: 大连密封材料    时间: 2025-4-1 04:29
标题: 使用服务器联合COLMAP方案实现自动化快速三维重修
总体技术思路

自动化三维重修是指通过计算机视觉、照相测量学和计算几多么技术,自动地从一组无人机倾斜照相测量图像中创建出精确的三维模型的过程。具体包罗数据收罗与预处理、COLMAP稀疏重修、COLMAP麋集重修、地理配准与格式转换、COLMAP泊松格网重修、纹理贴图和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下的编译
主要步骤为:

GCC升级
必要将GCC升级到5.4版本,以满意COLMAP的编译需求。这包罗下载、解压源码,设置编译选项,并实行make与make install进行编译安装。
底子包安装
使用yum命令安装一系列底子库,如cmake、build-essential等,为后续软件包的编译提供须要的开发工具和库文件。
第三方库安装
包罗Boost、gflags、glog、FreeImage和Ceres Solver在内的多个第三方库必要单独下载、编译并安装。每个库都有特定的安装步骤和留意事项,比如使用./bootstrap.sh初始化Boost的编译过程,对于gflags则通过cmake来构建动态链接库等。

末了一步是从GitHub下载COLMAP源码,并创建构建目录。通过cmake …生成Makefile文件,然后运行make进行编译,最终完成COLMAP的安装。
  1. mkdir build
  2. cd build
  3. cmake ..
  4. # For CentOS users, use following command.
  5. # CentOS ships BOOST lib only with shared lib.
  6. # cmake .. -DBOOST_STATIC=OFF
  7. make -j16
  8. make intall
复制代码
这些命令行用于编译一个软件项目,通常是从源代码开始构建软件。下面是对每个命令的解释:
COLMAP实现三维重修

COLMAP 进行三维重修的详细流程,包罗 GUI 和命令行两种方式
(1)使用 GUI 进行三维重修

留意:一般服务器没有gui界面的,但三维建模最好使用gui界面可以进行更好的结果查看
一般使用CentOS 7 安装GNOME的方法来创造GUI界面环境

然后使用VNC工具进行桌面gui环境的链接

最终服务器自带的结果界面如下所示:


7. 结果查看与导出

(2)使用命令行进行三维重修

无论是通过 GUI 照旧命令行,COLMAP 都提供了一套完整的流程来进行三维重修,从特征提取到稠密重修再到表面重修,每个阶段都有相应的参数调解空间,可以根据具体需求进行优化。
地理配准与格式转换

地理配准

参考链接:colmap笔记:将模型和影像位姿转换到GPS坐标系下
默认情况下,COLMAP 生成的模型是基于局部坐标系的,这意味着它们没有地理参考信息。为了将这些模型转换到基于 GPS 的全球坐标系下,可以使用 COLMAP 提供的 model_aligner 工具

确保你的图像文件包罗 EXIF 数据,特殊是 GPS 位置信息。COLMAP 可以自动读取这些信息,但假如你的数据不包罗这些信息,你必要手动提供一个包罗图像名称及其对应 GPS 坐标的列表文件。

首先,你必要完成 COLMAP 的稀疏重修过程,这会生成一个位于局部坐标系中的三维模型以及相机的姿态信息。

接下来,使用 model_aligner 工具来对齐模型。这个工具可以担当不同的参数设置,但基本命令如下所示:
  1. 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

这个文件包罗了数据集中所有重修相机的内在参数(即相机内参),每个相机占一行。每一行的数据布局如下:
  1. # Camera list with one line of data per camera:
  2. # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
  3. # 相机ID, 相机模型, 宽度, 高度, 参数数组
复制代码
比方:
  1. 1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
复制代码
这里的参数根据不同的相机模型而有所不同,比如 SIMPLE_PINHOLE 模型必要焦距和主点坐标作为参数。
images.txt

该文件包罗了数据集中所有重修图像的姿态(位姿)和关键点,每张图像占两行。第一行包罗图像的姿态信息和相机ID及名称,第二行则是与该图像关联的关键点及其对应的三维点ID。每一行的数据布局如下:
  1. # Image list with two lines of data per image:
  2. # IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
  3. # POINTS2D[] as (X, Y, POINT3D_ID)
复制代码
比方:
  1. 1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
  2. 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

该文件包罗了数据集中所有重修的三维点的信息,每个点占一行。每一行的数据布局如下:
  1. # 3D point list with one line of data per point:
  2. # POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
复制代码
比方:
  1. 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 坐标系具有以下特征:

与EPSG:4326的转换关系:

COLMAP泊松格网重修

这里其实colmap已经对稠密三维点云(fused.ply)文件进行了泊松三维格网的重修了,但是这个重修的mesh模型没有真实的地理信息,准确说是有相机的位置姿态信息,只是没有地理位置和巨细缩放信息
- 解决地理位置信息可以在obj2tiles工具进行3dtiles切片时自动设置
  1. /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三维纹理贴图文件必要的文件布局:

1、参数化(Parameterization)

这一步是为了创建UV坐标,将三维平面转为二维平面, 使其可以将mesh文件的颜色附着在UV坐标上形成纹理图片
2、纹理投影
这里可以设置纹理投影图片的像素巨细
![

3、导出为.obj文件

3dtiles切片处理

留意使用obj2tiles工具进行处理
源码链接:Obj2Tiles
命令行参数:
  1.   Input (pos. 0)         Required. Input OBJ file.
  2.   Output (pos. 1)        Required. Output folder.
  3.   
  4.   -s, --stage            (Default: Tiling) Stage to stop at (Decimation, Splitting, Tiling)
  5.   
  6.   -l, --lods             (Default: 3) How many levels of details
  7.   -d, --divisions        (Default: 2) How many tiles divisions
  8.   -z, --zsplit           (Default: false) Splits along z-axis too
  9.   -k, --keeptextures     (Default: false) Keeps original textures
  10.   
  11.   --lat                  Latitude of the mesh
  12.   --lon                  Longitude of the mesh
  13.   --alt                  (Default: 0) Altitude of the mesh (meters)
  14.   -e, --error            (Default: 100), baseError value for root node
  15.   --scale                (Default: 1), scale for data if using units other than meters ( 1200.0/3937.0 for survey ft)  
  16.   
  17.   --y-up-to-z-up         (Default: false) Converts Y-up to Z-up
  18.   
  19.   --use-system-temp      (Default: false) Uses the system temp folder
  20.   --keep-intermediate    (Default: false) Keeps the intermediate files (do not cleanup)
  21.       
  22.   --help                 Display this help screen.
  23.   --version              Display version information.
复制代码
为了增加 Levels of Detail (LOD) 的层级数目,你可以使用 -l 或 --lods 参数来指定你盼望生成的 LOD 层级数目。默认情况下,这个值是 3。下面是对命令中各个参数寄义的阐明,以及如何设置更多的 LOD 层级。

参数解释

调解其他参数以优化性能


通过这些参数的调解,你可以根据本身的需求优化输出的3D Tiles数据集,无论是为了更好的视觉效果照旧为了适应硬件资源限制。假如有特定的需求或遇到题目,请提供更多信息以便进一步资助。
最终在cesiumlab中加载3dtiles切片模型的效果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4