RGB-D视觉
(1)根据内参计算一对RGB-D图片对应的点云
(2)根据每张图的相机位姿(外参),把点云加起来,组成地图
遍历图像的每个像素,并将深度图的深度信息提取出来,将像素点归一化后,乘上深度信息就得到了相机坐标系下的点,最后左乘变换矩阵 T (这里的T是相机到世界系的变换)就得到了世界坐标系下的点。
1. 相机的内外参数
相机的内参是 fx fy cx cy 构成的矩阵,单位是像素 , fx = f , fy = 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
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画图就不再赘述了,和双目视觉类似。