• Colmap 实用教程 —— 整体介绍


    https://colmap.github.io/index.html

    工程文件结构

    1. +── images # 对应重建图片数据集
    2. │ +── image1.jpg
    3. │ +── image2.jpg
    4. │ +── ...
    5. +── sparse # 稀疏重建结果
    6. │ +── 0
    7. │ │ +── cameras.bin
    8. │ │ +── images.bin
    9. │ │ +── points3D.bin
    10. │ +── ...
    11. +── dense # 稠密重建结果
    12. │ +── 0
    13. │ │ +── images # 去畸变图像
    14. │ │ +── sparse
    15. │ │ +── stereo
    16. │ │ +── fused.ply # 稠密点云
    17. │ │ +── meshed-poisson.ply
    18. │ │ +── meshed-delaunay.ply
    19. │ +── ...
    20. +── database.db # 图像提取的特征相关信息
    21. +── project.ini # 项目信息文件

    重建图像采集要求

    • 获取丰富纹理的图像。避免完全无纹理的区域,比如白墙和空的桌子。如果物体本身没有足够的背景,可以考虑增加待纹理的背景。
    • 图像的光照条件尽可能保持一致。避免高的动态范围,比如逆光图片或者透过门窗的图片。同时避免有光泽的表面的镜面反射。
    • 图像之间具有较高的视觉重叠。确保每个物体至少在三张图像中可见,而且越多越好。
    • 从不同视角获取图像。不要维持位置不变只旋转相机,即每次拍照后都要移动一段距离。同时,尽量从相对相似的角度获得足够的图像。不过并不是更多的图像就更好,这可能会导致重建过程缓慢。如果使用视频作为输入,请考虑对帧速率进行下采样。

    相机模型

    Colmap 实现了不同的相机模型。不过如果相机内参未知,最好还是使用最简单的相机模型,其已经能够很好的解决畸变效应。

    • SIMPLE_PINHOLE, PINHOLE:适用于已知无畸变的图像。两个模型分别对应于一个统一焦距和两个分离焦距。不过即使是无畸变图像,Colmap 还是会尝试使用更复杂的相机模型去优化相机内参。
    • SIMPLE_RADIAL, RADIAL:适用于内参位姿且每张图像来自于不同的相机标定,比如互联网图像。两个模型都是 Opencv 模型的简化版本,分别使用一个和两个参数只建模了径向畸变。
    • OPENCV, FULL_OPENCV:适用于已知标定参数的情况。如果多张图像共享内参,可以使用 Colmap 进行进一步优化;不过如果每张图像具有不同的内参,自动估计大概率会失败。
    • SIMPLE_RADIAL_FISHEYE, RADIAL_FISHEYE, OPENCV_FISHEYE, FOV, THIN_PRISM_FISHEYE:适用于鱼眼镜头,同时所有其他的模型都不能真正地建模鱼眼镜头的畸变。其中 FOV 被 Google Tango 项目采用(必须确保不要将 omega 初始化为 0)

    特征提取与匹配

    特征提取

    Colmap 可以使用 GPU 或者 CPU 提取 SIFT 特征。GPU 版本需要一个额外的显示器,因此 CPU 版本更适合于服务器使用。通常情况下,GPU版本是性能更佳。因为它具有定制的特征检测模式,在高对比度图像的情况下,该模式通常会产生更高质量的特征。

    如果希望导入现有特征,每张图像必须具有一个对应的 text 文件,像 /path/to/image1.jpg and /path/to/image1.jpg.txt 这样。对应文件内容如下

    1. NUM_FEATURES 128
    2. X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
    3. ...
    4. X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
    5. 4 128
    6. 1.2 2.3 0.1 0.3 1 2 3 4 ... 21
    7. 2.2 3.3 1.1 0.3 3 2 3 2 ... 32
    8. 0.2 1.3 1.1 0.3 3 2 3 2 ... 2
    9. 1.2 2.3 1.1 0.3 3 2 3 2 ... 3

    特征匹配

    Colmap 提供了多样的特征匹配方式,不同的匹配方式有不同的适用场景。

    • exhaustive_matcher:针对少量图像(几百张量级),可以获得足够快且最好的重建结果。它将每张图像与其余所有图像进行匹配,不过 block size 可能限制同时加载到内存中的图像数量。
    • sequential_matcher:针对顺序采集的视频图像,由于相邻帧存在视觉上的重叠且没有必要进行完全匹配,它只匹配视频流中的相邻帧。同时,这种匹配方式能够基于 vocabulary tree 进行回环检测。最后,帧之间的前后关系由图像文件名给定,与数据集中的存储顺序无关。
    • vocab_tree_matcher:针对大量图像(几千帧量级),可以通过提供 vocabulary tree 从而快速检索视觉上最相近的图像进行匹配。
    • spatial_matcher:针对能够提供准确定位信息的图像,可以通过对应图像采集时的 GPS 信息从而仅匹配空间位置上相近的图像。
    • transitive_matcher:基于传递规则使用已有的特征匹配关系确定更完全的匹配图,即 A 与 B 匹配,B 与 C 匹配,那将直接匹配 A 和 C。
    • Custom Matching:通过 text 文件指定图像的匹配关系,如果是导入的特征可以进一步指定两张图像之间特征的匹配关系。

    数据库格式 —— database.db

    database.db 文件中存储着以下关系表:

    • cameras:包含相机内参,通过 ID 索引
    • images:包含相机外参,通过 ID 索引
    • keypoints:检测到的关键点
    • descriptors:对应关键点的描述符
    • matches:特征匹配结果
    • two_view_geometries:几何验证结果

    重建结果

    稀疏重建

    1. +── sparse # 稀疏重建结果
    2. │ +── 0
    3. │ │ +── cameras.bin
    4. │ │ +── images.bin
    5. │ │ +── points3D.bin

     其中既可以通过二进制文件表示,也可以通过 text 文件表示,其中具体内容细节如下:

    • cameras.bin\cameras.txt:
    1. # Camera list with one line of data per camera:
    2. # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
    3. # Number of cameras: 3
    4. 1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
    5. 2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152
    6. 3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531

    最后的相机参数依赖不同的 distortion model,其中 2559.81 1536 1152 分别表示焦距和 principal point 的像素位置。

    • images.bin\images.txt:
    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)
    4. # Number of images: 2, mean observations per image: 2
    5. 1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
    6. 2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
    7. 2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
    8. 1190.83 663.957 23056 1258.77 640.354 59070

    第一行中的 QW, QX, QY, QZ 为图像拍摄时相机的外参的四元数(使用 Hamilton 假设,符合 Eigen 中的定义),TX, TY, TZ 为对应外参的平移向量。

    第二行每三个数表示一个图像关键点,其中前两个值 X,Y 分别对应关键点在图像中的像素坐标,第三个值 POINT3D_ID 为对应关键点对应的三维重建点 ID,-1 表示没有对应三维点。

    • points.bin\points.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)
    3. # Number of points: 3, mean track length: 3.3334
    4. 63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
    5. 63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
    6. 63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473

    ERROR 为三维点的综合重投影误差;TRACK[] 每两个数表示三维点对应的一个图像二维特征点,分别对应图像 ID 和 这张图像的二维特征点 ID。 

    稠密重建

    1. +── images # 去畸变图像
    2. │ +── image1.jpg
    3. │ +── image2.jpg
    4. │ +── ...
    5. +── sparse # 基于去畸变图像的稀疏重建结果
    6. │ +── cameras.txt
    7. │ +── images.txt
    8. │ +── points3D.txt
    9. +── stereo # 立体重建的结果
    10. │ +── consistency_graphs
    11. │ │ +── image1.jpg.photometric.bin
    12. │ │ +── image1.jpg.geometric.bin
    13. │ │ +── image2.jpg.photometric.bin
    14. │ │ +── image2.jpg.geometric.bin
    15. │ │ +── ...
    16. │ +── depth_maps # 图像每个像素点的深度图
    17. │ │ +── image1.jpg.photometric.bin
    18. │ │ +── image1.jpg.geometric.bin
    19. │ │ +── image2.jpg.photometric.bin
    20. │ │ +── image2.jpg.geometric.bin
    21. │ │ +── ...
    22. │ +── normal_maps # 图像每个像素点的法线贴图
    23. │ │ +── image1.jpg.photometric.bin
    24. │ │ +── image1.jpg.geometric.bin
    25. │ │ +── image2.jpg.photometric.bin
    26. │ │ +── image2.jpg.geometric.bin
    27. │ │ +── ...
    28. │ +── patch-match.cfg
    29. │ +── fusion.cfg
    30. +── fused.ply # fusion 的结果
    31. +── meshed-poisson.ply # poisson mesh 的结果
    32. +── meshed-delaunay.ply # delaunay mesh 的结果
    33. +── run-colmap-geometric.sh # 基于几何的稠密重建代码
    34. +── run-colmap-photometric.sh # 基于视觉的稠密重建代码

    The consistency graph defines, for all pixels in an image, the source images a pixel is consistent with. (没理解 o_0)。

  • 相关阅读:
    Flet 教程大全合集
    CVE-2022-25845 反序列化漏洞分析
    代码随想录day13(2)栈与队列:用队列实现栈(leetcode225)
    事务回调编程
    CentOS8.2 配置go开发环境
    第58篇:创建Nios II工程之Hello_World<四>
    猜数字--
    Windows Hook案例分析与技术探索
    算法通关村第十八关——回溯
    基于复杂网络的大群体应急决策专家意见与信任信息融合方法及应用
  • 原文地址:https://blog.csdn.net/a40850273/article/details/127982257