Colmap源码-前端模块笔记
源码:https://github.com/colmap/colmap/tree/main/src/colmap
sift特征提取与描述
colmap/feature/sift.h 这个文件定义了特征提取和特征匹配的参数配置。
- colmap使用改良后的dsp-sift,基本与原版一致,区别在于特征点描述子不是直接取,而是在多个尺度内取平均,加强了鲁棒性
- 特征点描述子使用L1范数进行了归一化,消除光照影响,效果比L2范数好
- 使用siftGPU库
- 默认4阶,每阶3层(因为要借助DOG差分金字塔计算局部极值,实际每阶有3+3=6个图像),分阶实际上是想在σ有限的情况下不漏掉大尺度的特征
- sift特征提取中的相关概念可以参考视频:https://www.bilibili.com/video/BV161UKYjE5z/?share_source=copy_web&vd_source=2e706b2cc4ed4fc4ee0f4ad9862b3f01
- sift原理详解文章:https://mp.weixin.qq.com/s?__biz=MzU0NjgzMDIxMQ==&mid=2247599504&idx=3&sn=b3e46e54abc43a2e8952a1d774f69897
colmap/feature/types.h 定义了特征点、特征描述子以及特征匹配关系的存储格式。
colmap/scene/database_sqlite.cc 定义了将各类数据保存在sqlite中的方法,结合types.h来看。
- 数据库中采用6参数描述一个特征点:x,y,a11,a12,a21,a22
- 前两个代表特征点的二维坐标,后四个组成仿射形状矩阵,用于描述特征点周围部分区域的尺度和偏斜形状
- colmap默认采取经典方案,用圆来描述特征点,即位置xy+尺度σ+主方向θ:归一化σ确保对缩放不敏感,归一化θ确保对旋转不敏感;如果需要也可以参看sift.h设置参数,用椭圆来描述,增加对视角变化和图像倾斜的不敏感
- 匹配点的存储格式是特征点的索引对
colmap/controllers/feature_extraction.cc 定义了整个特征提取流程的调度器,管理各个过程的队列、多线程等。
- colmap支持mask功能,在MaskKeypoints方法中将不提取照片的mask部分的特征点,可以用来剔除易造成误匹配的部分,比如动态物体、无人机机架、天空、水面等
- 再比如,去除照片畸变后边缘多出的空白部分设为mask,减小计算量
sift特征匹配
colmap/feature/pairing.cc 定义了一系列图像配对生成器。
- 这个配对生成器包含各种匹配方法,如暴力匹配、词汇树匹配、顺序匹配、空间匹配、转移匹配;一般拼接素材都是有前后关系的,顺序匹配和空间匹配用得多
- 配对生成器并不得到最终的特征点匹配关系,而是先生成图像匹配对(Image Pairs),再由后续步骤对比图像上特征点的余弦相似度等指标进行筛选得到匹配关系
- 关于几种匹配方法:
- 顺序匹配,将某图像与其后overlap个图像生成Image Pairs,也就是在图像前后overlap范围内进行匹配,默认overlap=10
- 空间匹配,对每一个图像建立位置矩阵,设置邻居个数(默认50)和最大距离,利用knn算法得到每个图像最近的50个邻居,其中在最大距离之内的则建立匹配关系
- 转移匹配,由一系列(图像名1,图像名2)指定匹配关系,适合自定义匹配算法
colmap/estimators/two_view_geometry.cc 定义了“两视图几何估计”的核心逻辑方法。
- “两视图几何估计(Two-View Geometry)”这个词意思是通过对同一个点的两个不同视角恢复场景三维结构和相机位姿
- 它从两张图像的点的匹配关系中,估计相机的相对位姿、几何关系,同时做几何验证,区分内点(inliers,符合模型的点对)和外点(outliers,不符合模型的点对,一般是错误匹配或噪声)
- 针对两张图像,colmap会同时匹配三种模型:
- H(Homography),单应矩阵,针对平面或纯旋转相机(全景)
- F(Fundamental Matrix),基础矩阵,针对未标定的一般运动
- E(Essential Matrix),本质矩阵,针对标定相机的一般运动
- 经过RANSAC或LORANSAC拟合后会得到每种模型拟合的内点数量,比较E/F、H/F、H/E内点个数的比,最终决定使用哪种模型
- E本质上是由F经相机内参K矫正得到,对于未标定的相机,它的内参K未知,无法得到E,最终只会比较H/F(也有方法估计内参,比如利用照片本身的EXIF,或拟合模型自标定收敛)
- 由照片间内点个数可以得到临界矩阵热力图,红色条带越规整说明相机的轨迹规则、数据排列好;在丰富度上,暴力匹配>空间匹配>顺序匹配,随之而来的sfm的时间也越长,丰富度高并不一定减小误差,反而一般来说顺序匹配冗余信息最少、热力图最干净,最后自标定最准、精度也是最高的
- 比较相机运行轨迹,围着某点做环绕运动更容易使sfm收敛
优化点1SuperPoint+SuperGlue 利用神经网络进行特征点的提取和匹配,在季节和光照等长时间变换、重复纹理等 corner-case 上效果优于传统方法,但精度不如后者,在应用上注意:
- 可先用传统的ORB、SIFT做定姿定位,再加上learning特征做三角化
- 先对照片做去畸变可提升效果
- 参考源码:
优化点2feature-scale 定权优化,特征点的尺度(scale)一方面代表这个特征的远近,另一方面代表特征点的稳定性(尺度越小越容易受噪声影响,大尺度特征可信度更高);因此在BA优化过程中,将特征点尺度的倒数与重投影误差的组合设为最终误差方程,加大远处点的优化程度
Colmap源码-前端模块笔记
https://nnnut-zhou.github.io/2026/04/18/Colmap源码-前端模块笔记/