colmap重建一般步骤:
1. 找到关键点和特征
这里有很多匹配方式,如果超过1k张,尽量使colmap输入的图片有序号。这样确保查询重合度时,只需要查询相近的场景,不需要遍历全部图片。
2. 关键点匹配
3. 稀疏重建
注意事项:
输入的图片要尽可能满足:
1、纹理要多
2、相似光照
3、不同视角
4、重叠度高
colmap支持已存在的特征,需要通过txt等方法输入。
colmap提取文件存储到SQLite数据库中。所有信息都存在.db文件中。colmap的坐标系是左上角点为(0,0),中心点是(0.5,0.5)。
database.db的数据表
cameras:每个相机的参数
- - camera_id(一般只有一个相机),model(模型类型)
- - width,height(摄像机的高宽,也就是图片像素是widthX height)
- - params(相机参数)包括焦距信息,
- - prior_focal_length 事前焦距
images:相机和图片的关系是1对N
- - image_id(唯一,无序)
- - name 对应文件名
- - camera_id 摄像机id
keypoints:得到的特征点
- - image_id:图片id
- - rows:每个图片特征点点数
- - cols:点维度,默认6维
- - data:如果有6列
- - x,y:二维图片中坐标,左上为原点
- - a11=scale_x * cos(orientation)
- - a12=-scale_y * sin(orientation + shear)
- - a21=scale_x * sin(orientation)
- - a22=scale_y * cos(orientation + shear)
- 注:x_scaling,y_scaling(x,y方向上的高斯的模糊的系数,也就是尺度信息),orientation(关键点主方向),shear(倾斜参数,一个角度参数,描述与主方向偏差) )
- - data:如果有4列
- - x,y:二维图片中坐标,左上为原点
- - scale:放缩系数
- - orientation:主方向。
descriptors:特征描述子
- - image_id 描述子的id
- - rows 描述子数目
- - cols 描述子维度 默认128。使用了sift算法
- - data:描述子的二进制表示。
matches:特征匹配关系
- - pair_id 每个匹配的id,等于img2*2147483647+img1
- - rows 匹配的特征个数
- - cols 匹配点的数,默认为2
- - data 每对图片出现匹配的点对,每个点对格式 (point2D_idx1,point2D_idx2),总计rows个点对。
two_view_geometries:(几何关系)
- - pair_id 每个匹配的id,等于img2*2147483647+img1
- - rows:内部配置的匹配,少于matches里的配置。
- - cols:默认2
- - data:每对图片出现匹配的点对,每个点对格式 (point2D_idx1,point2D_idx2),总计rows个点对。
- - F:Fundamental matrix.基础矩阵是描述两个视图之间几何关系的重要工具。它可以通过对应点的坐标计算得到,表示了两个视图之间的投影关系。3*3 FLOAT64
- - E:Essential matrix.3*3 FLOAT64
- - H:Homography matrix.3*3 FLOAT64
- - config:0-8,不同配置 (一般0(无匹配点),3,6((只有F和H,E为0))
- - UNDEFINED = 0:默认,
- - DEGENERATE = 1:Degenerate configuration (e.g., no overlap or not enough inliers). Essential matrix.
- - CALIBRATED = 2:Essential matrix.
- - UNCALIBRATED = 3: Fundamental matrix.
- - PLANAR = 4:Homography, planar scene with baseline.
- - PANORAMIC = 5:Homography, pure rotation without baseline.
- - PLANAR_OR_PANORAMIC = 6:Homography, planar or panoramic
- - WATERMARK = 7: Watermark, pure 2D translation in image borders.
- - MULTIPLE = 8: Multi-model configuration, i.e. the inlier matches result from multiple individual, non-degenerate configurations.
输出的文件
(有两个文件后缀,其中.bin是二进制文件,.txt是文本文件)
- cameras
- images
- point3D
- project.ini(项目配置文件,记录设置)
cameras.bin/.txt: 得到相机模型的配置信息
Camera list with one line of data per camera:每行每相机,下面是每行中的元素
- - CAMERA_ID
- - MODEL:模型,默认针孔相机模型
- - WIDTH, HEIGHT:相机宽高。
- - PARAMS[]:补充信息,如果是针孔,那么是焦距+主点位置(x,y)
image.bin/.txt:得到图片的信息
图像的本地相机坐标系是这样定义的:从图像上看,X轴指向右,Y轴指向下,Z轴指向前
Image list with two lines of data per image:(一张图片的信息占两行)
- 第一行 IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME,tu[1] :(QW, QX, QY, QZ)是world坐标系到camera坐标系的旋转,一个四元组。(TX, TY, TZ)是移动向量,
- 第二行 POINTS2D[] as (X, Y, POINT3D_ID):这一行可能有很多点,图像中每个点的格式是2d坐标加3d坐标点的id,如果没有对应的3d点,那么标为-1
point3D:得到的三维空间中点的信息
3D point list with one line of data per point:数据集中所有重建的3D点的信息
- POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX):点id,(x,y,z)重建后的三维坐标,R,G,B,点的颜色信息。error是重投影之后的误差,(IMAGE_ID, POINT2D_IDX)这是表示点的来源,有哪些图片中有,它是这个图片中那个关键点,比如(1,5)表示第一张图的第五个关键点与这个空间中的点匹配。