OpenCV-C++学习笔记其一

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

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

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

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

例程:

#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

暂无评论

相关推荐

Git极简教程

本教程旨在快速掌握git的基本用法,应付最基本的开发需求已经足够,不涉及原理和更多用法,获取更详细的教程建议查 ...

微信扫一扫,分享到朋友圈

OpenCV-C++学习笔记其一