opencv 点云 打开 opencv显示点云_opencv 点云 打开


「本文介绍了在Linux系统下由双目视觉图像获得三维点云的案例,程序每一行都有注释讲解」

(关于SLAM更基础的介绍打算放到本系列的前两篇文章,后面再补吧)

Pangolin是Linux系统中基于 OpenGL的3D绘图库,OpenCV是应用广泛的开源计算机视觉库。本文中涉及一些使用中的常见指令。本案例实现思路如下:

根据双目视觉的左右眼图像(灰度图):


opencv 点云 打开 opencv显示点云_c++ opencv4.5.0 头文件_02


opencv 点云 打开 opencv显示点云_opencv 点云 打开_03


通过调用OpenCV中的SGBM算法计算得到两幅图像的视差图:


opencv 点云 打开 opencv显示点云_c++ opencv4.5.0 头文件_04


再通过双目相机的几何模型,将其变换至三维空间,获得点云矩阵,在Pangolin中将其画出:


opencv 点云 打开 opencv显示点云_c++ opencv4.5.0 头文件_05


在实现程序时用到的OpenCV和Pangolin基本指令介绍包括但不限于:

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

完整的代码已经放在下方,包括主程序和CMakeLists.txt,程序中由更为详细的注释:

主程序:


#include


CMakeLists.txt:


cmake_minimum_required