视觉SLAM ch5代码总结(三)

RGB-D视觉

(1)根据内参计算一对RGB-D图片对应的点云

(2)根据每张图的相机位姿(外参),把点云加起来,组成地图

遍历图像的每个像素,并将深度图的深度信息提取出来,将像素点归一化后,乘上深度信息就得到了相机坐标系下的点,最后左乘变换矩阵 T (这里的T是相机到世界系的变换)就得到了世界坐标系下的点。

1. 相机的内外参数

相机的内参是 fx fy cx cy 构成的矩阵,单位是像素 , fx = \alpha f , fy = \beta f    内参是不变的;

相机的外参是相机的位姿R和t ,外参会随着相机运动发生改变,是SLAM中带估计的目标,代表着机器人的轨迹。

2. return 0 return 1 区别

return 0 代表程序正常退出,return 1代表程序异常退出

3.boost/format

作用:批量存储文件路径

(1条消息) c++中的boost::format使用方法_hhl317的博客-CSDN博客https://blog.csdn.net/hhl317/article/details/118937838

(先看下这篇文章)

例:

#include
#include
boost::format fmt("./data/%  s    % d. %  s ");
cv::imread((  fmt         %"color"% 1  %"png").str(),1);  //./data/color1.png

 程序中的代码如下

boost::format fmt ("../%s/%d.%s");  //图像文件格式
colorImgs.push_back( cv::imread(   (fmt % "color" % (i+1)  % "png" ).str() ,   1     )   );

看起来虽然复杂,把他拆开

boost::format fmt(" ../ %   s /   %   d .   %     s  " );
              fmt       % "image" % (i + 1) % "png").str();

// 相对路径为 ../ image/ (i+1).png  
//这样写虽然麻烦 但容易理解
boost::format fmt ("../%s/%d.%s");  
              fmt %"color";
              fmt %(i+1);
              fmt %"png";

string path = fmt.str();

cv::Mat image = cv::imread(path, 1);
colorImgs.push_back(image);

 上面代码是把  image文件下的五张彩色图片放到容器colorImgs中

4. reserve

pointcloud.reserve(1000000);

reserve为容器预先分配内存空间,并未初始化空间元素

5. p.head<3>() = pointWorld;

head()函数是对于Eigen库中的向量类型而言的,表示提取前n个元素
 

6.  彩色图中访问图像像素,使用data数组

opencv中图像的data数组表示把其颜色信息按行优先的方式展成的一维数组
 

7.Mat_

Mat_类一般应用于矩阵(matrix)的运算。

Mat_ 也是一个模板类,注意它有一个下划线,以与Mat作为区别。在实际使用中,Mat_ 与 Mat 的操作函数没有多大区别,只不过Mat_需要在创建时定义元素类型,以后再调用它的方法是就不需要再传入数据的类型,而且还定义了一个操作符()来获取元素的位置。

这两个类之间的区别就是一个是定义时指定类型(Mat_),一个是使用时指定类型,可以按照不同的情况来使用。

Mat_ M(20, 20);
    for (int i = 0; i < M.rows; i++)
        for (int j = 0; j < M.cols; j++)
            M(i, j) = i + j + 1;//不使用at,直接用()索引,更方便
                            

如果是使用Mat,  最后一行应该是:

M.at(i,j) = ********

使用Mat_定义一个矩阵

Mat K = (Mat_(3,3)<<1,2,3,4,5,6,7,8.9);

关于使用pangolin画图就不再赘述了,和双目视觉类似。

你可能感兴趣的:(视觉SLAM,opencv,slam)