colmap重建失败记录:部分照片畸变导致sfm生成的稀疏点云扭曲

张开发
2026/6/10 21:48:10 15 分钟阅读
colmap重建失败记录:部分照片畸变导致sfm生成的稀疏点云扭曲
一、问题如题要进行一个大场景的3DGS重建数据集来自于某工地现场大约3000张照片数据集拍摄于同一个相机按照国际惯例3DGS需要输入一个稀疏点云所以首先利用colmap进行稀疏重建。进行特征提取特征匹配colmap官网建议1000-10000张图的特征匹配使用vocab tree稀疏重建以后发现场景中楼宇出现弯曲分裂现象如下图:问题出现以后查看在colmap gui界面双击)弯曲部分对应的照片楼宇上下拍摄角度的照片并没有发现畸变楼宇是直的简单的用尺子或者其他工具对比一下楼宇是否有弯曲从拍摄的照片来看虽然是对着楼宇上下拍摄但是无人机的镜头并没有调正很多照片全是偏向于俯视头大尾小虽然这样不影响重建效果但是处理这些必然是要花费更多时间相比于端正拍摄的镜头来说。然而在检查楼宇最上方的俯视视角照片时发现了几处畸变原来问题出现在这里因为这些畸变的出现colmap的计算产生了误差导致原本方形的楼宇扭曲。后续删除了一些畸变很大的照片。二、处理实际上对于照片中存在的畸变colmap一般可以修正猜想这个问题有可能因为特征提取时限定了所有路径下图片使用同一个相机模型。因为数据集路径中楼宇的上下与环绕视角空中俯视视角两种类型的照片存于不同文件夹考虑将上下与环绕视角的数据单独分出来先进行重建先得到正确的楼宇点云然后在这个正确的结果之上进行全局的稀疏重建。具体先重建出上下环绕视角的点云然后所有图片重新走一次sfm过程特征提取的时候使用camera for subfolder每一个文件夹使用一个相机模型而不是所有文件夹使用同一个相机模型)然后特征匹配这里可以使用前面重建上下环绕视角的时候得到的database.db文件里面存储了之前的特征提取和匹配的数值这样可以更快一点colmap vocab_tree_matcher --database_path path/to/databse.db ...。下图是正确的楼宇环绕点云:在进行最后一步稀疏重建的时候添加一个参数--input_path这个指向已有的稀疏点云也就是前面重建的上下环绕视角点云这样在这个正确点云的基础上重建剩余全部视角得到修正的全局稀疏点云。整体数据集稀疏重建成功进入3DGS训练过程注意大场景的训练显存占用较大一些硬件高斯基元相关的参数需要调整一下。三、潜在的问题3.1问题上面提到了在colmap内使用--input_path来添加一个预先重建好的点云来使得一开始所有图片all in重建失败变为成功但是前面忽略了细节先总结一下前面step1先行对一开始重建有问题对应的部分数据比如说数据集文件夹下的某几个子文件夹进行重建特征提取-匹配-稀疏重建注意保存这个稀疏重建的结果。step2数据集中所有图片进行特征提取-匹配然后在终端中使用colmap mapper进行重建在--input_path后面加上刚才保存的路径即可注意前后两次流程中特征提取对应的相机模型、相关选项所有子文件使用同一个相机模型还是一个子文件夹使用一个相机模型要前后一致。下面介绍因为忽略文件路径导致的报错图1在ubuntu使用colmap mapper --input_path时报错check failed原因是有两张图图片对应的有问题existing_image.Name() image.second.Name() (1/77.71511885467315.png vs. 1/44.58024851431659.png)查看了对应的图片确实不对图2win10下两个图片的名称倒是一致但是在database里面写入的路径不一致一个是9/47.2另一个是global/9/47.2多了一级报错原因在step1时有一个database文件后称database1在step2时有另外一个database文件后称database2添加--input_path以后加载过程中database1会与database2对齐如果里面文件不一致自然就会报错3.2解决win10win10的解决我的原始路径是folder\input\在input有两个文件夹global和local注意这里的细节伏笔在路径中global排在local前面。我直接将global复制进另一个新建好的文件夹inputglobal这个文件夹和input同一级重建执行step1最后win10中得以跑通。3.3解决ubuntu22仔细看ubuntu中的报错信息与win10类似但是不一样这完全是把两张不一样的图片对应起来了这里就是前面win10中提到的伏笔ubuntu中input路径下有两个文件夹0/和1/而step1中我想使用的是1/然后我直接把1/复制到了和input同一级下执行了step1导致了两个问题一是前面说的路径问题1/应该是一个子文件夹二是子文件夹的顺序1/在0/之后所以database1长这样为了方便把前面那张图放过来方便对比database2里面的第700张图长这样这就是这个报错的具体由来好了既然知道了为什么会错那就明白从哪改起了重新放置文件路径把原来的1/和0/互换个名字然后重新执行step1和step2

更多文章