「本文介绍了在Linux系统下由双目视觉图像获得三维点云的案例,程序每一行都有注释讲解」
(关于SLAM更基础的介绍打算放到本系列的前两篇文章,后面再补吧)
Pangolin是Linux系统中基于 OpenGL的3D绘图库,OpenCV是应用广泛的开源计算机视觉库。本文中涉及一些使用中的常见指令。本案例实现思路如下:
根据双目视觉的左右眼图像(灰度图):
通过调用OpenCV中的SGBM算法计算得到两幅图像的视差图:
再通过双目相机的几何模型,将其变换至三维空间,获得点云矩阵,在Pangolin中将其画出:
在实现程序时用到的OpenCV和Pangolin基本指令介绍包括但不限于:
- <opencv2/opencv.hpp>头文件包含了各个模块的头文件,原则上无论创建哪个模块的应用程序,仅写一句#include <opencv2/opencv.hpp>即可,以达到精简代码的效果。
- #include<unistd.h>是C++中提供对操作系统访问功能的头文件,如fork/pipe/各种I/O(read/write/close等等)。
- cv::imread()函数用于读取图像。参数1为图像路径;参数2为设置为0时,表示返回灰度图像,默认值为1,代表返回彩色图像。
- OpenCv中的SGBM算法用于计算左右图像的视差。官方文档:https://docs.opencv.org/master/d2/d85/classcv_1_1StereoSGBM.html
- cv::Mat.at<存储类型名称>(行,列)[通道],用以遍历像素。省略通道部分时,可以看做二维数组简单遍历,例如M.at<uchar>(512-1,512*3-1);不省略通道部分时,例如M.at<uchar>(512-1,512-1)[3]。
- 使用C++标准模板库中的动态数组类(4维)存放点云数据。
- cv::imshow()函数输出显示disparuty,显示窗口命名为引号中的内容。
- cv::waitKey()函数,等待关闭显示窗口。括号内参数为零则表示输入一个按键才会关闭,为数值则表示等待X毫秒后关闭。
- pangolin::CreateWindowAndBind()函数用于创建一个Pangolin的画图窗口,声明窗口的 命名以及显示的分辨率。
- glEnable(GL_BLEND)启用gl_blend混合。Blend混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。
- glClearColor:red、green、blue、alpha分别是红、绿、蓝、不透明度,值域均为[0,1]。即设置颜色,为后面的glClear做准备,默认值为(0,0,0,0)。应当注意的时此函数仅仅设定颜色,并不执行清除工作。
- glPointSize 函数指定栅格化点的直径。一定要在要在glBegin前,或者在画东西之前。
- glBegin()要和glEnd()组合使用。其参数表示创建图元的类型,GL_POINTS表示把每个顶点作为一个点进行处理。
完整的代码已经放在下方,包括主程序和CMakeLists.txt,程序中由更为详细的注释:
主程序:
#include
CMakeLists.txt:
cmake_minimum_required