已知相机内外参通过COLMAP进行稀疏/稠密模型重建操作过程

      在https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses  中介绍了已知相机内外参如何通过COLMAP进行稀疏和稠密模型重建的过程,这里按照说明操作一遍:

      在instant-ngp中,执行scripts/colmap2nerf.py时除了生成transforms.json外,还有一些中间文件生成,如colmap_text目录,此目录下有3个文件:
      (1).cameras.txt:相机内参
      (2).images.txt:相机外参
      (3).points3D.txt:3D点云数据
      这里以lego中train目录的数据作为测试集,执行命令如下:注:执行命令前移除train中的r_48.png和r_91.png两幅图像,因为在执行colmap2nerf.py时,此两幅图像并没有进入images.txt中

python ../../../scripts/colmap2nerf.py --colmap_matcher exhaustive --colmap_camera_model PINHOLE --run_colmap --images train --aabb_scale 4

      1.在instant-ngp/data/nerf/lego目录下新建目录reconstruct/created/sparse/model,将colmap_text目录下的3个文件拷贝到此目录下并做修改:模拟已知的相机内外参,实际中应为真实场景获取的数据

mkdir -p reconstruct/created/sparse/model
cp -a colmap_text/* reconstruct/created/sparse/model/

      (1).cameras.txt:不需要调整
      (2).images.txt:调整,每两行定义一幅图像的信息,删除第二行
      (3).points3D.txt:清空

      2.提features,执行如下命令:执行结果如下图所示,生成database.db

colmap feature_extractor --ImageReader.camera_model PINHOLE --database_path database.db --image_path ../train

      3.手动导入相机内参:将cameras.txt中的内参拷贝到database.db中. IMAGE_ID为对应图像在database management的顺序,CAMERA_ID为对应使用的相机,若只使用一台相机全为1.
      手动导入:
      (1).打开COLMAP GUI,双击COLMAP.bat;
      (2).File --> New project: 
            1).Database:Open,刚生成的database.db
            2).Images:Select, 选择存放图像集的目录,然后点击Save
      (3).Processing --> Database management:点击Cameras,对每个camera_id的params进行修改:修改为cameras.txt对应的,注意:两边的CAMERA_ID要一一对应,如下图所示:

      4.特征匹配,执行如下命令:结果如下图所示,database.db会被修改 

colmap exhaustive_matcher --database_path database.db

      5.点三角测量,执行如下命令:目录triangulated/sparse/model需要手动创建 

colmap point_triangulator --database_path database.db --image_path ../train --input_path created/sparse/model --output_path triangulated/sparse/model

      处理错误:reconstruction.cc:79 Check failed: existing_image.Name() == image.second.Name() (r_13.png vs. r_11.png)
      将database.db中Images中image_id, camera_id, name三者要与images.txt中的完全一一对应,database.db中Images内容如下图所示:按照此顺序,调整images.txt,注:只修改IMAGE_ID的值,不要忘记最后的空行

      修改后重新执行上述命令,结果如下图所示:triangulated/sparse/model目录下会生成cameras.bin, images.bin, points3D.bin, database.db也会被修改

      6.查看稀疏模型重建结果:打开COLMAP GUI
      (1).File --> Import Model: 选择triangulated/sparse/model目录
      (2)."Directory does not contain a project.ini" 点击:No: 查看重建结果,结果如下图所示:
      (3).导出model为txt:File --> Export model as text: 将结果保存在triangulated/sparse/model目录下:会生成project.ini, cameras.txt, images.txt, points3D.txt,可与created/sparse/model目录下的文件作对比,看两边camera_id, image_id是否一致,不一致会影响后续的执行 

      7.image undistorter,执行如下命令:结果如下图所示,dense/workspace目录需手动创建,dense/workspace目录下会生成images、sparse、stereo三个目录 

colmap image_undistorter --image_path ../train --input_path triangulated/sparse/model --output_path dense/workspace

 

      8.稠密3D重建,执行如下命令:结果如下图所示,注,此步需要CUDA支持,Anaconda安装时并没有指定,这里使用从官网下载的可执行文件,并且需要将lib目录下的动态库拷贝到colmap.exe目录下,否则会提示缺少各种动态库,此步比较耗时,在台式机上执行,在dense/workspace/stereo目录下,depth_maps和normal_maps目录内会增加类似r_0.png.geometric.bin,r_0.png.photometric.bin文件 

D:/soft/COLMAP/COLMAP-3.8-windows-cuda/bin/colmap.exe patch_match_stereo --workspace_path dense/workspace

      9.稠密点云融合,执行如下命令:结果如下图所示,在dense/workspace目录下会生成fused.ply文件 

colmap stereo_fusion --workspace_path dense/workspace --output_path dense/workspace/fused.ply

      10.查看稠密模型重建结果:打开COLMAP GUI
      (1).Reconstruction --> Dense reconstruction: 点击Select,选择dense/workspace目录
      (2).点击Fusion,稍等片刻,弹出对话框,为了可视化点云,点击Yes,结果如下图所示
      (3).关闭Dense reconstruction,可对可视结果进行缩小、放大、旋转等操作

 

### 使用已知相机COLMAP 为了在 COLMAP 中利用已知相机进行三维重建或特征点匹配,可以按照如下方法操作: #### 准备工作 确保已经安装并配置好 COLMAP 环境。准备用于重建的一系列图像以及相应的相机数文件。 #### 导入已有相机 当拥有预先校准好的相机矩阵时,在导入图片之前可以通过编辑数据库来指定这些数。具体做法是在命令行工具中使用 `database_path` 和 `image_path` 数启动 COLMAP GUI 或者通过脚本方式调用相应接口[^1]。 对于每张图片,创建一条记录包含其 ID、宽度、高度、相机型号(如 PINHOLE)、焦距 f (px),主点 u0, v0 及径向畸变系数 k1,k2...等信息。如果不存在畸变,则设为零值即可。这一步骤可通过编写 Python 脚本来批量处理多个图像及其对应的内数据[^2]。 ```bash colmap database_creator \ --database_path path/to/database.db colmap image_importer \ --image_path path/to/images \ --database_path path/to/database.db \ --default_camera_model OPENCV \ --camera_params "fx,fy,cx,cy" ``` 上述代码片段展示了如何初始化一个新的 SQLite 数据库,并将带有固定内设置的照片集加载进去。注意这里的 `--camera_params` 需要用实际测量获得的具体数值替换掉占位符 fx fy cx cy。 #### 执行稀疏重建 完成以上准备工作之后就可以运行 SfM 流程来进行初步的空间结构恢复了。此时由于已经提供了精确的内部数估计,理论上应该能够取得更好的重建效果和更高的效率。 ```bash colmap feature_extractor \ --database_path path/to/database.db \ --ImageReader.single_camera 1 colmap exhaustive_matcher \ --database_path path/to/database.db mkdir sparse colmap mapper \ --database_path path/to/database.db \ --output_path sparse/0 ``` 这段 shell 命令序列依次完成了特征提取、描述子匹配及增量式映射构建三个阶段的任务。其中特别指定了单目模式下统一采用相同的相机模型以适应预定义的内情况。 #### 进行稠密重建 一旦获得了可靠的稀疏点云表示形式后,便能进一步开展 MVS 步骤获取更精细的结果。此过程同样依赖于先前给定的相机内外方位元素作为约束条件之一。 ```bash mkdir dense colmap image_undistorter \ --input_path sparse/0 \ --output_path dense \ --image_path path/to/images \ --output_type COLMAP colmap patch_match_stereo \ --workspace_path dense colmap stereo_fusion \ --workspace_path dense \ --output_path dense/fused.ply ``` 最后这几条指令负责消除镜头失真影响、执行立体匹配算法计算深度图并通过融合技术形成完整的三维表面网格。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值