目录
1.如何使用本篇博客
1.1 patchmatchnet网络环境配置
1.2 colmap环境配置
2.如何利用colmap制作自己的三维重建数据集
2.1 采集数据
2.2 使用colmap计算位姿
2.3 转换位姿到MVS读取的格式
2.4 剔除离群图片
2.5 运用patchmatchnet进行三维重建
1.如何使用本篇博客
1.1 patchmatchnet网络环境配置
我的电脑是R9000K2022 3080ti 16G显存版,在阅读本篇博客前,请一定确保已经安装配置好了深度学习环境,我的深度学习环境的cuda版本是cuda11.3,cudnn8.2.1。
我们可以通过nvcc -V命令来查看我们的cuda环境是否配置成功。
这里的patchmatchnet源码是基于pytorch的,请确保成功安装了pytorch1.8.0版本及以上版本的pytorch。
image_dir = os.path.join(args.folder, 'images')
model_dir = os.path.join(args.folder, 'sparse')我们下载好patchmatchnet后,下载dtu数据集,将下载好的dtu数据集放入/home根目录文件夹中。
然后我们修改eval.py中的程序形参:
parser.add_argument('--dataset', default='dtu_yao_eval', help='select dataset') parser.add_argument('--testpath',default='/home/dtu/', help='testing data path')
第一个参数改成dtu_yao.py的路径,第二个改称dtu数据集的路径。
parser.add_argument('--testlist', default='/home/xxxx/Desktop/slam/PatchmatchNet-main/lists/dtu/test.txt', help='testing scan list')
这个文件里面的内容是对于哪一个数据集进行三维重建,本文的后面我们也会介绍如何利用自己的数据集进行三维重建。(我们对于scan118进行重建)
parser.add_argument('--loadckpt', default='./checkpoints/model_000007.ckpt', help='load a specific checkpoint')
这个里面存储的预训练模型,这个模型我给大家,:
parser.add_argument('--outdir', default='./outputs', help='output dir')
这里面存储的是我们的算法(patchmatchnet输出的)深度图和置信度图,以及我们三维重建的点云图像。
我们设置完这些后,执行eval.py,我们看看执行过程。
正在进行三维重建ing:
完成后就是这个样子的:
我们在根目录的output里面可以看到我们的点云图像和深度图以及置信度图。
效果是十分的好:
1.2 colmap环境配置
在乌班图下就用一行命令就可以安装了:
sudo apt install colmap
我们直接在命令行收入colmap gui就能使用它的图形化界面了!赞鲁阿
2.如何利用colmap制作自己的三维重建数据集
2.1 采集数据
这里用相机拍摄即可:我们拍摄了一些树木的图片。/home/liuhongwei/Desktop/102.png
2.2 使用colmap计算位姿
也可以用slam计算。我们建立新项目:建立数据库和图像文件的路径的选择,如下图:
然后进行特征提取:在Processing下的Feature extraction选项卡里面:我们选择针孔相机模型进行特征提取。
提取完成后如下图:
随后我们进行特征匹配,在Processing下的Feature matching选项卡里面:
匹配运行完之后我们点击Reconstruction选项卡下面的Start Reconstruction进行图片位姿重建。(好像有点奇怪,不过不影响)/home/liuhongwei/Desktop/100.png
我们导出位姿,在File选项卡下面的Export Model as text。保存在目录sparse下:
2.3 转换位姿到MVS读取的格式
这里需要用到脚本文件,我放入了我的csdn资源里面:colmap_input.py文件
https://download.csdn.net/download/qq_41694024/87766201 我们来看这个脚本的参数:
parser.add_argument('--folder', default='./data',type=str, help='Project dir.') parser.add_argument('--theta0', type=float, default=5) parser.add_argument('--sigma1', type=float, default=1) parser.add_argument('--sigma2', type=float, default=10)
我们需要用我们的路径代替data路径。
image_dir = os.path.join(args.folder, 'images') model_dir = os.path.join(args.folder, 'sparse')
我们在这个data文件夹下需要有一个images的文件夹存储图像序列,sparse存储我们保存的位姿文件。如下图:
if __name__ == '__main__': parser = argparse.ArgumentParser(description='Convert colmap results into input for PatchmatchNet') parser.add_argument('--folder', default='/home/xxxxx/Desktop/树木3D',type=str, help='Project dir.') parser.add_argument('--theta0', type=float, default=5) parser.add_argument('--sigma1', type=float, default=1) parser.add_argument('--sigma2', type=float, default=10) parser.add_argument('--test', action='store_true', default=False, help='If set, do not write to file.') parser.add_argument('--convert_format', action='store_true', default=False, help='If set, convert image to jpg format.') args = parser.parse_args() image_dir = os.path.join(args.folder, 'image') model_dir = os.path.join(args.folder, 'sparse')
我们执行这个脚本,执行如下图即成功!
2.4 剔除离群图片
在colmap计算位姿时,可能有些图片的位姿无法计算,这可能是你照片照的角度问题,我们需要剔除这些图片后,将图片重新命名成如下格式存储在image文件夹里面。如图:
这里我给大家提供一个脚本可以批量处理图像文件:
脚本1:将拍摄图片命名规则化:
import os folder_path = '/home/liuhongwei/Desktop/new' # 替换为你的文件夹路径 i = 1 for filename in os.listdir(folder_path): if filename.endswith('.jpg') or filename.endswith('.png') or filename.endswith('.jpeg') or filename.endswith('.JPG'): basename = os.path.splitext(filename)[0] # 获取文件名(不含扩展名) extension = os.path.splitext(filename)[1] # 获取扩展名 new_filename = '{:08d}{}'.format(i, extension) os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename)) i += 1
脚本2:将拍摄图片的JPG结尾的文件转换成patchmatchnet认出的jpg文件结尾的形式。
import os folder_path = "/home/liuhongwei/Desktop/slam/PatchmatchNet-main/data/image" # 替换为您要更改文件扩展名的文件夹路径 # 循环遍历该文件夹下的所有文件 for filename in os.listdir(folder_path): # 检查文件是否是 JPG 格式 if filename.endswith(".JPG"): # 构建新文件名 new_filename = os.path.splitext(filename)[0] + ".jpg" # 重命名文件 os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename))
现在我们已经完成了数据集的构建。
执行完脚本后我们得到了如下文件结构:
pair.txt存储着图片之间的匹配关系,cams_1存储着相机的内外参数。
2.5 运用patchmatchnet进行三维重建
执行eval_custom.py文件即可:
模型最终存储在 /home/liuhongwei/Desktop/slam/PatchmatchNet-main/outputs_custom0/custom.ply中,我们可以用meshlab打开,可以看到点云质量还可以。