学习记录-视觉SLAM十四讲第2版(七)

文章目录

  • 前言
  • 一、5.3-5.4实践部分
    • 1.Opencv的安装
    • 2.imageBasics项目
    • 3.undistortImage项目
    • 4.stereoVision项目
    • 5.jointMap项目
  • 二、第5讲的普通习题
    • 2.叙述相机内参的物理意义
    • 3.搜索特殊相机的标定方式
    • 4.调研全局快门相机和卷帘快门相机的异同
    • 5.RGB-D相机是如何标定的
    • 6.举出其他遍历图像的方法
  • 总结


前言

系统环境:ubuntu20.04
这几天又抽了时间看了SLAM十四讲的第5讲相机与图像,前面5.1和5.2相对比较简单就不再赘述,这里讲一下5.3-5.4的实践部分,以及后面的普通习题部分。


一、5.3-5.4实践部分

1.Opencv的安装

根据十四讲的书上的安装相应的依赖,但是报了很多错误:
学习记录-视觉SLAM十四讲第2版(七)_第1张图片
因此进行了适当的调整,比如将libvtk5-dev换成libvtk7-dev,libtiff4-dev换成libtiff-dev

sudo apt install build-essential libgtk2.0-dev libvtk7-dev libjpeg-dev libtiff-dev libopenexr-dev libopenexr-dev

而libjasper-dev最麻烦,搜索了一下,还需要重新添加链接进行安装

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

这些处理完后,我才开始安装Opencv,由于高博用的是Opencv3,所以我这里选择下载了opencv-3.4.zip。
然后就是常规的cmake…和make,make比较久,最后make install反而很快。
参考资料:libjasper-dev无法定位的问题

2.imageBasics项目

这里主要是需要对整个ch5项目进行编译,并且要添加参数。
解决了这个问题后,第一次的输出如下:

搜索了一下,安装对应的库就好了,指令如下:

sudo apt-get install libcanberra-gtk-module

重新运行项目,结果如下
在这里插入图片描述
而且先后会输出三张图像,第一张是原图,按下任意键后会弹出将原图左上角置为白色的图像,接着是弹出将原图左上角置为黑色的图片。主要就是展示了opencv的一些基本操作。

3.undistortImage项目

修改了图片地址后就成功跑起来了,结果是同一张图片去畸变前后的效果比较。

4.stereoVision项目

编译这个项目然后就报错了,一看这个错误好熟悉啊,跟之前第3讲当时安装Pangolin时的问题一模一样,就是c++的标准设置问题。学习记录-视觉SLAM十四讲第2版(七)_第2张图片
在Cmakelist.txt这个文件中将下面这一行修改

# 添加c++ 11标准支持,改为c++14即可
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")

修改完2张照片的地址后编译运行,得到下面的结果:
学习记录-视觉SLAM十四讲第2版(七)_第3张图片
学习记录-视觉SLAM十四讲第2版(七)_第4张图片
这里面主要是利用了一个Opencv自带的函数来计算视差,再根据公式去计算深度和三维坐标。

5.jointMap项目

编译的时候又报错了,就还是找不到这个文件,这个问题在第4讲里也讨论过了,因此直接在cmakelist.txt中增加一句链接语句就好了。

target_link_libraries(joinMap Sophus::Sophus)

然后就是不停的地址问题,首先是pose.txt的地址问题,然后就是批量化的图片和深度信息的地址问题,把第28行代码

boost::format fmt("./%s/%d.%s"); //图像文件格式

前面的./去掉,然后第29-30行使用绝对地址就可以了。跑出来效果如下:
学习记录-视觉SLAM十四讲第2版(七)_第5张图片
这个代码主要是利用了RGB-D相机的相关参数和数据,一一读取并将点云坐标计算出来,同时将计算出来的点云坐标放入一个向量中存储起来,最后再一块显示出来,从而达到拼接的目的。但是因为误差的存在,效果只能说是差强人意了。

二、第5讲的普通习题

2.叙述相机内参的物理意义

普通相机的内参是 f x , f y , c x , c y f_x,f_y,c_x,c_y fx,fy,cx,cy,而 f x 和 f y f_x和f_y fxfy是缩放比例和焦距的乘积,而分辨率是指图像中像素的个数,分辨率变大也就意味着图像和真实情况的缩放比例缩小,因此相机的内参 f x 和 f y f_x和f_y fxfy将缩小为原来的一半。

3.搜索特殊相机的标定方式

标定方法:棋盘标定法、横向展开法、经纬度法
和普通的针孔模型的最大不同是:具有很大的畸变,因此在标定过程中需要对畸变进行处理,而且透视投影模型不适用于鱼眼镜头。
具体可以参考:鱼眼相机标定方法

4.调研全局快门相机和卷帘快门相机的异同

全局快门:整幅图片在同一时间曝光。
卷帘快门:通过控制芯片逐行曝光。
在SLAM中的优缺点:
全局快门:曝光时间短时,适合动态物体的拍摄;曝光时间长时,拍摄动态物体会出现模糊的情况。
卷帘快门:不适合拍摄动态物体,会出现模糊的情况。
参考资料:全局快门和卷帘快门

5.RGB-D相机是如何标定的

和一般的双目之类的标定相似,但是还是需要标定深度相机和彩色相机之间的旋转变化情况,以及深度值校准的一个参数,可以利用的现有工具有很多,比如matlab、opencv、ros等。
参考资料:
1、Kinect2相机的标定
2、RGB-D相机的标定

6.举出其他遍历图像的方法

示例程序中用的是指针,老实说,是我就直接用数组的下标进行访问。。。


总结

本文对第5讲的实践部分进行了总结,并对第5讲的普通习题进行了处理和归纳。

你可能感兴趣的:(学习记录,学习,计算机视觉,linux,ubuntu)