系统环境:ubuntu20.04
这几天又抽了时间看了SLAM十四讲的第5讲相机与图像,前面5.1和5.2相对比较简单就不再赘述,这里讲一下5.3-5.4的实践部分,以及后面的普通习题部分。
根据十四讲的书上的安装相应的依赖,但是报了很多错误:
因此进行了适当的调整,比如将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无法定位的问题
这里主要是需要对整个ch5项目进行编译,并且要添加参数。
解决了这个问题后,第一次的输出如下:
搜索了一下,安装对应的库就好了,指令如下:
sudo apt-get install libcanberra-gtk-module
重新运行项目,结果如下
而且先后会输出三张图像,第一张是原图,按下任意键后会弹出将原图左上角置为白色的图像,接着是弹出将原图左上角置为黑色的图片。主要就是展示了opencv的一些基本操作。
修改了图片地址后就成功跑起来了,结果是同一张图片去畸变前后的效果比较。
编译这个项目然后就报错了,一看这个错误好熟悉啊,跟之前第3讲当时安装Pangolin时的问题一模一样,就是c++的标准设置问题。
在Cmakelist.txt这个文件中将下面这一行修改
# 添加c++ 11标准支持,改为c++14即可
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
修改完2张照片的地址后编译运行,得到下面的结果:
这里面主要是利用了一个Opencv自带的函数来计算视差,再根据公式去计算深度和三维坐标。
编译的时候又报错了,就还是找不到
target_link_libraries(joinMap Sophus::Sophus)
然后就是不停的地址问题,首先是pose.txt的地址问题,然后就是批量化的图片和深度信息的地址问题,把第28行代码
boost::format fmt("./%s/%d.%s"); //图像文件格式
前面的./去掉,然后第29-30行使用绝对地址就可以了。跑出来效果如下:
这个代码主要是利用了RGB-D相机的相关参数和数据,一一读取并将点云坐标计算出来,同时将计算出来的点云坐标放入一个向量中存储起来,最后再一块显示出来,从而达到拼接的目的。但是因为误差的存在,效果只能说是差强人意了。
普通相机的内参是 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 fx和fy是缩放比例和焦距的乘积,而分辨率是指图像中像素的个数,分辨率变大也就意味着图像和真实情况的缩放比例缩小,因此相机的内参 f x 和 f y f_x和f_y fx和fy将缩小为原来的一半。
标定方法:棋盘标定法、横向展开法、经纬度法
和普通的针孔模型的最大不同是:具有很大的畸变,因此在标定过程中需要对畸变进行处理,而且透视投影模型不适用于鱼眼镜头。
具体可以参考:鱼眼相机标定方法
全局快门:整幅图片在同一时间曝光。
卷帘快门:通过控制芯片逐行曝光。
在SLAM中的优缺点:
全局快门:曝光时间短时,适合动态物体的拍摄;曝光时间长时,拍摄动态物体会出现模糊的情况。
卷帘快门:不适合拍摄动态物体,会出现模糊的情况。
参考资料:全局快门和卷帘快门
和一般的双目之类的标定相似,但是还是需要标定深度相机和彩色相机之间的旋转变化情况,以及深度值校准的一个参数,可以利用的现有工具有很多,比如matlab、opencv、ros等。
参考资料:
1、Kinect2相机的标定
2、RGB-D相机的标定
示例程序中用的是指针,老实说,是我就直接用数组的下标进行访问。。。
本文对第5讲的实践部分进行了总结,并对第5讲的普通习题进行了处理和归纳。