0
点赞
收藏
分享

微信扫一扫

OpenCV个人学习心得(1) —— Mat类

at小涛 2022-04-04 阅读 108

Mat

概念

Mat:用于读取和保存图像以及其他矩阵数据,默认尺寸为0

Mat中包含许多构造函数,用来构造一个矩阵,这些矩阵就是我们处理图像的基本的操作对象,其中的属性包括行列类型等。

Mat由两个数据部分组成:矩阵头和一个指向存储所有像素值的矩阵。

数据头包括:矩阵尺寸,存储的方法,存储地址等)

由于矩阵中的像素值可能会很庞大,那么OpenCV就利用了信息头,拷贝和使用时,只改变信息头,并不把整个矩阵再拷贝一份。只拷贝信息头和指向矩阵数据的指针。

Mat会有计数机制,当最后一个头被释放,计数值为0,那么矩阵就会被清理。如果只是想拷贝矩阵本身(不仅仅是信息头和矩阵指针)就用Clone()或者copyTo()

用法

基本的构造

    Mat(int rows, int cols, int type);

rows 矩阵行        cols列        type类型

类型例如CV_8UC1

CV_8UC3指的是:CV_ [每一项的位数][有无符号][类型前缀]C为字符型[通道数]

下面代码示例来理解一下type

    Mat M1(3,2,CV_8UC1,Scalar(0,0,255));
    Mat M2(3,2,CV_8UC2,Scalar(0,0,255));
    Mat M3(3,2,CV_8UC3,Scalar(0,0,255));
    cout << M1 << endl;
    cout << M2 << endl;
    cout << M3 << endl;

 可以看到,同样都是三行两列,0,0,255,显示不同的通道,是不一样的,画红色为一个单元。

下面一幅图更好的理解通道:来源于 官方文档(这是一个三通道类型矩阵)

 

Size类构造

    Mat(Size size, int type);

附带Scalar构造

    Mat(int rows, int cols, int type, const Scalar& s);
    Mat(Size size, int type, const Scalar& s);
    Mat(int ndims, const int* sizes, int type, const Scalar& s);
    Mat(const std::vector<int>& sizes, int type, const Scalar& s);

使用create

可以使用create(),这样可以先定义Mat对象,然后再使用其带有的create函数

   Mat M_without_parameter;
   M_without_parameter.create(4,4,CV_8UC3);
   cout << M_without_parameter << endl;

 简易构造

    Mat M_simple = (Mat_<double>(3,3) << 0, 7, 0, -1, 5, 4, 0, -1, 0);
    cout << M_simple << endl;

其他

使用ndims ,建立几维矩阵

   Mat(int ndims, const int* sizes, int type);

利用容器来构建,用容器来直接构建矩阵,可以直接用二维容器,也可以使用一个为行,另一个为每列的数组

    Mat(const std::vector<int>& sizes, int type);

可以进行拷贝

    Mat(const Mat& m);

这种拷贝方式,仅仅只是

将头和矩阵指针拷贝了,矩阵并没有增多。

附带初始数据构造

 Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);

仅对Mat有初步了解 2022-4-4 

举报

相关推荐

0 条评论