当前位置:   article > 正文

c++ opencv4.5.0 头文件_SLAM从0到1——3. 由双目视觉图像获得三维点云(含Pangolin/OpenCV基本指令讲解)...

opencv 三维建模点云详细

1e99648fecc76937261274ac050cb9be.png

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

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

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

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

20762a708c2eb87b1d92fc625520beb4.png

d9ad107623f7173c99d7aabcc2784c2e.png

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

11387de3142016e464a4b96db09947b0.png

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

cd5d2387cf398ad916df1445cde62394.png

在实现程序时用到的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
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号