python 稠密重建_毕业设计记录的三维重建2:CMVs密集点云重建,之,2cmvs,稠密,实现...
稠密重建部分直接在sfm的基础之上调用cmvs可执行程序,cmvs集成了稀疏点云聚类算法和基于面片的稠密重建算法pmvs,其中pmvs是目前效果最好的稠密重建算法。
cmvs可执行程序在windows上的使用
准备资源.:在
此处
下载名为
CMVS for Windows
的文件,在下载后的binariesWin-Linux文件夹下即可找到对应的可执行文件,按照自己电脑配置选择Win32或Win64。(我选择Win64)
创建根文件夹,将Win64中的文件都拷贝到该文件夹内。
在根文件夹下创建一个名为pmvs的文件夹。该文件夹存放cmvs需要的输入文件及cmvs的输出结果。目录结构如下所示。

准备输入的文件:pmvs下应有三个子文件夹和一个文件,分别如下图所示。

models
:空文件夹,留给cmvs存放最终生成的ply格式点云。
txt
:存放
每个图片对应的投影矩阵
,命名方式为00000000.txt,00000001.txt,以此类推。(n个图片对应n个文件)
visualize
:存放重建使用的所有图片,命名方式为00000000.jpg,00000001.jpg,依次类推。图片顺序应与txt文件顺序对应,即名为00000000.jpg的图片的矩阵存放在00000000.txt中。
bundle.rd.out
:按照
bundler格式
存放的sfm输出文件。
执行:一般意义上使用命令窗口执行cmd命令来调用cmvs程序,但我之前的项目使用的是python编写,因而我使用python执行cmd命令。代码如下:
root = os.getcwd()
设置命令
commend1 = root + "\cmvs.exe" + " " + root + "\pmvs\ "
commend2 = root + "\genOption.exe" + " " + root + "\pmvs\ "
commend3 = root + "\pmvs2.exe" + " " + root + "\pmvs\ option-0000"
执行CMVS
process = subprocess.Popen(commend1, shell=True)
process.wait()
process = subprocess.Popen(commend2, shell=True)
process.wait()
process = subprocess.Popen(commend3, shell=True)
process.wait()
注意:第三个命令中,option-0000前面必须有空格;执行完一个命令再执行下一个命令,否则程序会出错。
执行完成后,在/pmvs/models中的option-0000.ply文件就是稠密重建的结果。
准备输入文件
有三个输入文件需要准备,下面依次说明。
visualize:这里是重建图片的副本,将待重建图片复制到visualize文件夹下即可,
注意命名必须为8位(4位也可)数字,格式最好为jpg
。

txt:每个图片对应的投影矩阵存放格式如下:

sfm已经了解了投影矩阵,P为内参矩阵与外参矩阵的乘积。存储txt文件的时候注意
顺序与visualize中图片顺序对应,最好sorted一下
。
每个txt中存放的实际内容参考如下:

3. bundle.rd.out
文件格式:

#Bundle file v0.3 :文件头
总相机数(正常情况下等同于总的重建图片数) 总点数(sfm输出的稀疏点云点总数)
实际内容参考:

每个相机参数(一个相机参数由五行数据表示)
格式为:

第一行:焦距f 畸变参数k1 畸变参数k2
第二到四行:旋转矩阵R
第五行:平移量t
实际内容参考:

每个点参数(一个点参数由三行数据表示)
格式为:

第一行:三维点的坐标
第二行:该点的RGB颜色
第三行:该点的详细信息
第一个参数:能观察到该点的相机个数。之后以< camera > < key > < x >< y >四个参数参数为一组依次写入。
其中:< camera >为相机(图片)索引,< key >为keypoint序列索引,< x >< y >为该keypoint在图片上的二维坐标。
实际内容参考:

参考博客:
