0%

OpenCV-C++学习笔记其一:什么是Mat,怎么使用

1,什么是Mat

Mat其实是一个c++的类,本质是一个矩阵,但相对于我们线性代数中的矩阵还多了矩阵头,整个Mat的结构如下:

20230827162405

顺便补充一下opencv中的数据类型:

20230827162835

除了引用次数之外,其他的数据应该都得经常用emmm

2,Mat怎么用?

好问题,Mat其实也可以理解成一种数据类型,像我们平常使用int a = 1或者float b = 2.0类似,我们可以使用以下几种方法来创建Mat类:

20230827162924
20230827162959
20230827163707
20230827163807
20230827163826

有点多,没关系,其实前面几个都是一样的,只不过是写法上的区别罢了,本质还是需要输入矩阵的行数和列数,再补充数据类型以及具体数据。

回到代码上,最常用的就下面这两个:

1
2
3
4
5
//格式:(行,列,数据类型,每个数据各个通道中的数据)
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中的数据:

20230827165108

注意到在读取单通道数据时我们进行了一次(int)的强制类型转换,这是因为原本矩阵中的数据为unchar类型,保存出来的value要变成int类型

例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}

顺便附上最近找到的比较不错的opencv C++教程:https://www.bilibili.com/video/BV1ZS4y1e7wY

PPT十分简洁,讲课条理清晰,老师声音也好听hhh