OpenCV-C++学习笔记其一:什么是Mat,怎么使用
1,什么是Mat
Mat其实是一个c++的类,本质是一个矩阵,但相对于我们线性代数中的矩阵还多了矩阵头,整个Mat的结构如下:
顺便补充一下opencv中的数据类型:
除了引用次数之外,其他的数据应该都得经常用emmm
2,Mat怎么用?
好问题,Mat其实也可以理解成一种数据类型,像我们平常使用int a = 1或者float b = 2.0类似,我们可以使用以下几种方法来创建Mat类:
有点多,没关系,其实前面几个都是一样的,只不过是写法上的区别罢了,本质还是需要输入矩阵的行数和列数,再补充数据类型以及具体数据。
回到代码上,最常用的就下面这两个:
//格式:(行,列,数据类型,每个数据各个通道中的数据)
Mat a (4, 4, CV_8UC3, Scalar(1, 2, 3)); //CV_8U后面的“C3”代表每个矩阵数据有3个通道
//格式: cv::Mat_<数据类型>(行,列) << 填充进来的数据
Mat b = (cv::Mat_<int>(3,3)<< 1,2,3,4,5);
3,创建Mat类后怎么使用数据
同样类似于int a = 1,我们创建一个变量的是为了使用它。在opencv中要使用at方法来读取Mat中的数据:
注意到在读取单通道数据时我们进行了一次(int)的强制类型转换,这是因为原本矩阵中的数据为unchar类型,保存出来的value要变成int类型
例程:
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace std;
using namespace cv;
int main(){
Mat a (4, 4, CV_8UC3, Scalar(1, 2,3));
cout << a << endl;
Mat b = (cv::Mat_<int>(3,3)<< 1,2,3,4,5);
cout << b << endl;
cout << "single channel: " << b.at<int>(0,0) << endl;
cout << "multi-channel: " << a.at<Vec3b>(0,0) << endl;
Vec3b vec_a = a.at<Vec3b>(0,0);
int fst_val_a = vec_a[2];
cout << "first val of 3 channel: " << fst_val_a << endl;
}
暂无评论
要发表评论,您必须先 登录