继续跟随《视觉SLAM十四讲》学习SLAM问题,由于理论方面已经有一些研究,主要缺乏的是在LINUX下的实战开发能力,因而从代码开始分析入手,同时对C++11进行回顾。
1. openCV 中的Mat类
Mat类用于存储图像信息,详细信息见 https://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html ,这里我们主要针对几个常用的点展开来记录。
- 类的结构
Mat是由两个数据部分,包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等的矩阵头和一个指针,指向包含了像素值的矩阵(可根据选择用于存储的方法采用任何维度存储数据)。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不同而不同,通常是较大的数量级。 - 构造函数
Mat类的默认构造函数为cv::Mat::Mat(),生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针,例如:
/ 关于 cv::Mat 的拷贝
// 直接赋值并不会拷贝数据
cv::Mat image_another = image;
// 修改 image_another 会导致 image 发生变化
image_another ( cv::Rect ( 0,0,100,100 ) ).setTo ( 0 )