文档地址:Tutorial — COLMAP 3.11.0.dev0 documentation
background:
Structure-from-Motion
分为三个阶段(colmao软件也是按这个阶段进行划分解耦的):
-
Feature detection and extraction
-
Feature matching and geometric verification
-
Structure and motion reconstruction
操作软件的时候也是按照这三个部分来的,先提取特征(看样子是SIFT角点检测类的算法)、然后特征匹配和集合验证,最后是重建。
Multi-View Stereo
(Multi-View Stereo, MVS)利用(Structure from Motion, SfM)的输出来计算图像中每个像素的深度和/或法线信息。通过融合多个图像的深度图和法线图,MVS 可以生成场景的密集点云。使用融合点云的深度和法线信息,诸如(屏幕)泊松表面重建算法 [kazhdan2013] 等技术可以恢复场景的3D表面几何形状。
如何提高软件重建的效果?
-
拍摄具有良好纹理的图像。避免完全无纹理的图像(例如,纯白的墙壁或空桌子)。如果场景本身没有足够的纹理,您可以放置额外的背景物品,比如海报等。
-
在相似的光照条件下拍摄图像。避免高动态范围的场景(例如,逆光拍摄带有阴影的照片或透过门窗拍摄的照片)。避免光滑表面上的反射亮点。
-
拍摄具有高度视觉重叠的图像。确保每个对象至少出现在3张图像中——越多越好。
-
从不同的视角拍摄图像。不要只在同一位置旋转相机来拍摄图像,例如,每次拍摄后请走几步。同时,尽量从相对相似的视角获取足够的图像。请注意,更多的图像并不一定更好,可能会导致重建过程变慢。如果使用视频作为输入,建议降低帧率。
软件操作流程:
输入的Data Structure
拍摄好多视角图片之后放到一个文件夹里面,文件夹的结构如下:
/path/to/project/... +── images │ +── image1.jpg │ +── image2.jpg │ +── ... │ +── imageN.jpg +── database.db +── project.ini # 每个project的参数configuration
database.db是保存软件使用过程中的一些参数,比如提取的特征、相机位姿参数了等等。可以通过: processing -》Database manage查看并修改。
软件启动
先新建一个Database,选择一个地方,输入数据库名即可。
然后选择存放图片的文件夹。
但是注意:文件夹内拍摄的图片最好是相同size的,使用相同相机拍摄的,或者干脆直接拍一个视频,然后使用ffmpeg截帧即可,命令如下:
ffmpeg -i input.mp4 -vf "fps=10" output_%04d.png #每秒取10帧
Feature Detection and Extraction
选择相机参数并提取特征
内置了十个相机参数:
- SIMPLE_PINHOLE (ID: 0) - 简单针孔模型,使用3个参数(焦距fx, fy 和主点坐标cx, cy)来描述。它假设没有镜头畸变。
- PINHOLE (ID: 1) - 针孔模型,使用4个参数来描述,与简单针孔模型类似,但允许焦距在x轴和y轴上不同。
- SIMPLE_RADIAL (ID: 2) - 带有一个径向畸变参数的简单针孔模型,共4个参数。
RADIAL (ID: 3) - 带有两个径向畸变参数的针孔模型,共5个参数。- OPENCV (ID: 4) - OpenCV使用的相机模型,包括两个径向畸变参数和两个切向畸变参数,共8个参数。
- OPENCV_FISHEYE (ID: 5) - OpenCV鱼眼模型,同样包括两个径向畸变参数和两个切向畸变参数,共8个参数,但专门用于鱼眼镜头。
- FULL_OPENCV (ID: 6) - 完整的OpenCV相机模型,包括更多的畸变参数,共12个参数。
- FOV (ID: 7) - 视野模型,考虑了焦距、主点位置和一个额外的畸变参数,共5个参数。
- SIMPLE_RADIAL_FISHEYE (ID: 8) - 简单的鱼眼模型,带有一个径向畸变参数,共4个参数。
- RADIAL_FISHEYE (ID: 9) - 鱼眼模型,带有两个径向畸变参数,共5个参数。
THIN_PRISM_FISHEYE (ID: 10) - 薄棱镜鱼眼模型,考虑了更多的畸变类型,共12个参数。
然后点击Extract即可,提取完关掉这个窗口就行。然后打开processing -》Database manage就能查看了,点那个Show image就会出现选中的图片和提取的角点特征,点那个Overlapping images就会显示和这张图片有重叠特征的图片,还会显示有多少特征点重叠,但是这一步操作完了暂时是看不到的,得等下一步Feature Matching完了之后才能看到。
注意,第一部分的相机参数可以指定也可以直接默认:
You can either automatically extract focal length (焦距)information from the embedded EXIF information or manually specify intrinsic parameters, e.g., as obtained in a lab calibration. If an image has partial EXIF information, COLMAP tries to find the missing camera specifications in a large database of camera models automatically. If all your images were captured by the same physical camera with identical zoom factor, it is recommended to share intrinsics between all images. Note that the program will exit ungracefully if the same camera model is shared among all images but not all images have the same size or EXIF focal length. If you have several groups of images that share the same intrinsic camera parameters, you can easily modify the camera models at a later point as well (see Database Management). If in doubt what to choose in this step, simply stick to the default parameters.
可以选择自动从嵌入的EXIF信息中提取焦距信息,或者手动指定内参,例如实验室校准得到的参数。如果图像的EXIF信息不完整,COLMAP会尝试在一个大型的相机模型数据库中自动查找缺失的相机规格。如果所有图像都是使用相同的物理相机并且具有相同的变焦因子拍摄的,建议在所有图像之间共享内参。请注意,如果所有图像共享相同的相机模型但并非所有图像都具有相同的大小或EXIF焦距,程序将会异常退出。如果您有几个组的图像共享相同的内参,您也可以在稍后的阶段轻松修改相机模型(详见数据库管理)。如果您不确定在此步骤中选择什么,只需坚持使用默认参数即可。
第一步的数据格式
如果你想导入一些现有的feature,colmap也规定了文件格式:
NUM_FEATURES 128 X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128 ... X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
其中:X, Y, SCALE, ORIENTATION是浮点数,D_1…D_128 是0-255的整数 ,文件第一行会说明特征数和特征维度,例如:
4 128 1.2 2.3 0.1 0.3 1 2 3 4 ... 21 2.2 3.3 1.1 0.3 3 2 3 2 ... 32 0.2 1.3 1.1 0.3 3 2 3 2 ... 2 1.2 2.3 1.1 0.3 3 2 3 2 ... 3
Feature Matching and Geometric Verification
点击:Processing 》feature matching即可。
内置了六种匹配算法:
- 穷尽匹配:如果你的数据集中的图像数量相对较少(最多几百张),这种匹配模式应该足够快,并能产生最佳的重建结果。在此模式下,每张图像都会与其他每张图像进行匹配,而块大小决定了同时从磁盘加载到内存中的图像数量。
- 顺序匹配:如果图像是按顺序获取的,例如通过视频摄像机获取,此模式非常有用。在这种情况下,连续帧之间存在视觉重叠,没有必要对所有图像对进行穷尽匹配。相反,连续捕获的图像会相互匹配。这种匹配模式内置了基于词汇树的循环检测功能,每隔 N 张图像(循环检测周期 `loop_detection_period`)就会与视觉上最相似的图像(循环检测图像数 `loop_detection_num_images`)进行匹配。请注意,图像文件名必须按顺序排列(例如,image0001.jpg, image0002.jpg 等)。数据库中的顺序无关紧要,因为图像会根据文件名显式排序。请注意,循环检测需要预先训练好的词汇树,可以从 https://demuc.de/colmap/ 下载。
- 词汇树匹配:在这种匹配模式下 [schoenberger16vote],每张图像都会使用带有空间重排序的词汇树与其视觉最近邻进行匹配。这是推荐用于大量图像集合(数千张)的匹配模式。这需要预先训练好的词汇树,也可以从 https://demuc.de/colmap/ 下载。
- 空间匹配:这种匹配模式将每张图像与其空间最近邻进行匹配。空间位置可以在数据库管理中手动设置。默认情况下,COLMAP 还会从 EXIF 中提取 GPS 信息并用于空间最近邻搜索。如果有准确的位置信息,这是推荐的匹配模式。
- 传递匹配:这种匹配模式利用已存在的特征匹配的传递关系来生成更完整的匹配图。如果图像 A 匹配到图像 B 而 B 又匹配到 C,那么这个匹配器会尝试直接匹配 A 和 C。
- 自定义匹配:此模式允许指定个别图像对进行匹配或导入个别特征匹配。要指定图像对,你需要提供一个文本文件,每行包含一对图像:每一行先是匹配的图片名称,然后是两张图片中匹配的点的标号:
image1.jpg image2.jpg 0 1 1 2 3 4 <empty-line> image1.jpg image3.jpg 0 1 1 2 3 4 4 5 <empty-line> ...
点击Matching之后就可以点击 Processing -> Database Manage ->Overlapping Image查看特征重叠部分了。
特征Match这一步很耗时,作者提到,所以最好还是找一个GPU不错的电脑。
Expected times for exhaustive matching are from a few minutes for tens of images to a few hours for hundreds of images to days or weeks for thousands of images
Sparse Reconstruction
打开:Reconstruction > Start,即可进行重建,但是重建的效果不怎么好。才300多个点,不好很正常。
Dense Reconstruction
然后我们进行稠密重建。点击Reconstruction > dense reconstruction。
然后选择一个工作目录来保存结果,然后左面的按钮直接从左点到右,其中Stergo和Fusion很耗时间和资源,确保电脑性能足够。不同按钮代表的算法不再赘述。
重建完的效果还是不错的。
colmap是查看不了每个点的法线的,想要看得用meshlab。把.ply文件拉进去就行。
想要看每个点的法线得拉到meshlab中选择render->show Normal/Curvature才可查看法线。
关于Undistortion,还提供了几种其他的算法,可以在Extra -> Undistortion里面设置