基于SFM的三维重建点云合并及位移测量
[2] https://blog.****.net/abccc250110119/article/details/93471816
[3] https://www.cnblogs.com/21207-iHome/p/6034792.html
Ubantu虚拟机的安装
-
在官网下载vmware workstation windows最新版并安装
-
在官网下载Ubantu合适版本的ISO镜像,这里用的是16.04.3
-
打开vmware主页,点击“创建新的虚拟机”
-
选择“典型”
-
浏览并选择已经下载好的Ubantu系统镜像
-
输入一些个人与安装信息并确认
-
完成后便可以打开虚拟机了
-
启动虚拟机后,会出现以下界面,左侧选择我们想安装的语言,右边选择安装Ubuntu
-
选择为图形或无线硬件,不要选择安装Ubuntu时下载更新,否则会先下载,速度很慢
-
选择其他选项,这样就可以自己创建、调整分区
-
然后选择创建新分区表,这时候会出现一个21474MB大小空闲的设备
-
进行分区,分区之后如下图
-
分区之后,在下面选择/boot分区,也就是选择/dev/sda6,这样就设置了安装启动引导其的设备,进行安装,或许有的小伙伴看不到下面的按钮,可以按这ALT然后鼠标拖动从窗口
-
点击现在安装之后会弹出下面的窗口,点击继续即可
-
之后会出现以下界面,选择时区Shanghai
-
选择键盘布局,选择左侧的汉语,然后选择右侧的汉语
-
接下来设置系统用户,和密码,密码为登陆系统的密码,要牢记
-
点击继续,就会进入到安装系统的界面了,只需等待
SFM、CMVS-PMVS及其环境的安装
- 在Ubantu系统中按住CTRL+alt+T调出终端
- 在linux终端输入:
git clone https://github.com/snavely/bundler_sfm.git
git clone https://github.com/pmoulon/CMVS-PMVS.git
若没有安装git,则按照终端的提示输入指令安装git - 安装bundler相关依赖:
sudo apt-get install liblapack-dev libblas-dev minpack-dev f2c gfortran jhead imagemagick
- 在 http://www.cs.ubc.ca/~lowe/keypoints/ 下载SIFT。(因为bundler需要SIFT进行特征提取)
- 安装SIFT依赖:
sudo apt-get install libc6-dev-i386
- 安装CMVS/PMVS依赖:
sudo apt-get install libgtk2.0-dev libdevil-dev libboost-all-dev libatlas-cpp-0.6-dev libatlas-dev libcminpack-dev libgfortran3 libmetis-edf-dev libparmetis-dev freeglut3-dev libgsl0-dev
- 进入Makefile文件所在的目录:
cd /你自己的安装目录/bundler_sfm/
编译 :make
- 将下载好的SIFT解压,进入文件夹中编译:
make
- 将sift可执行文件拷贝到bundler_sfm下的bin目录下
- 将jhead文件拷贝到bundler_sfm下的bin目录下:
sudo cp /usr/bin/jhead bin/
- 生成libANN_char.so:
cd bundler_sfm -master
make
- 将bundler_sfm/bin/目录下生成的libANN_char.so文件拷贝到系统库:
sudo cp bin/libANN_char.so /usr/lib/
- 接下来对CMVS-PMVS进行编译,使用cd命令进入到CMVS-PMVS/program/下,然后依次执行以下命令:
mkdir build && cd build
cmake ..
make
- 执行完成后,CMVS-PMVS也就编译完成了,生成的可执行文件位于build目录下的main目录中。将生成的可执行文件cmvs、genOption、pmvs2这三个文件拷贝到bundler_sfm目录的bin下。
相片拍摄调制与点云形成
-
位移前图像进行三个角度的多张图片拍摄,并将其称为1-1,1-2,1-3
-
利用“光影魔术手”软件将图片的分辨率改为640*480的同时保存EXIF信息
-
位移后的图像也进行同样的拍照操作,并将其称为2-1,2-2,2-3
-
查看bin目录下extract_focal.pl配置文件中有没有自己所用相机的CCD宽度或CMOS宽度信息,若没有,在网上查找并写入进去,如:
-
在虚拟机中bundler_sfm/example文件夹下新建peach_1文件夹,将图片集1-1复制到文件夹中
-
在终端中使用cd命令进入到peach_1文件夹下,然后执行以下命令
../../RunBundler.sh
-
最终会生成很多的结果文件,其中bundler文件夹下的bundler.out中存储了重建的稀疏点3D坐标和相机参数。
-
接下来我们就可以利用PMVS进行稠密点云的重建了,在这之前需要将Bundler的输出转换为CMVS-PMVS的输入格式。利用bin下的Bundle2PMVS即可完成这一过程。
../../bin/Bundle2PMVS prepare/list.txt bundle/bundle.out
-
此时会生成pmvs目录,在此目录下有prep_pmvs.sh文件,编辑此文件,将里边的BUNDLER_BIN_PATH修改为bundler的bin文件夹的实际路径。
BUNDLER_BIN_PATH="/你自己的路径/bundler_sfm/bin
-
然后依次执行如下操作:
sh pmvs/prep_pmvs.sh
(在这一步出现了报错“unexcepted operator”,可修改sh默认连接到bash:sudo dpkg-reconfigure dash
,解决报错)../../bin/cmvs pmvs/
../../bin/genOption pmvs/
../../bin/pmvs2 pmvs/ option-0000
生成的最终结果位于pmvs目录的models 文件夹下,名称为option-0000.ply -
对6个图片序列分别进行如上操作得到点云
点云文件的合并与保存
-
回到windows系统中,在官网上下载meshlab最新版并安装
-
运用meshlab打开1-1,1-2,1-3的点云
-
点击Align开始配准
-
在右边的tool栏中选择基准点云,并点击Glue Here Mesh,选择好之后点云名字前面会出现一个星号。
-
然后选择另一块点云,点击Point Based Glueing,这时弹出一个窗口,在两块点云上手动选择匹配点,至少选4对点之后点OK确认。双击鼠标左键进行选择,按住Ctrl双击左键消除选择。
-
之后会发现,两块点云基本上重合在了一起,并且第二块点云名字前也出现了一个星号。初始配准之后,我们将进行ICP配准,注意Param ICP Default中的默认参数,根据需要进行修改。如果我们的两块点云大小相同,那么就要勾选Rigid matching选型。如果我们不勾选,那最终的变换矩阵中将会有一个缩放因子。
-
点击Process之后软件开始自动计算,然后按照上述步骤再次合并第3幅点云
-
对任意一个点云图层右键并点击Flatten Visible Layers,选择1,3,4并apply
-
按住ctrl+s保存合并的点云
-
对2-1,2-2,2-3也采取上述操作进行合并,以下是合并的点云图片
-
再对上面两幅合并的点云进行合并操作
任意两点的距离量测
-
采用measure工具量取标准距离,两个黄色标识之间的实际距离为10cm,测量距离为0.412087
-
桃子的位移测量距离为0.916609,算的实际距离为10*0.916609/0.412087=22.24cm
-
实际桃子的位移距离约为22~23cm,这此方法对于位移测量是值得参考的