01_OpenCv之Mat类

01_OpenCv之Mat类

一.构造函数

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

其中:

  • rows:代表矩阵的行数
  • cols:代表矩阵的列数
  • type:代表类型,包括通道数及其数据类型,可以设置为CV_8UC(n)、CV_8SC(n)、CV_16SC(n)、CV_16UC(n)、CV_32SC(n)、CV_32FC(n)、CV_64FC(n),其中8U、8S、16S、16U、32S、32F、64F前面的数字代表Mat中每一个数值所占的bit数,所以32F就是占4字节的float类型,64F就是占8字节的double类型,32S是占4字节的int类型,8U是占1字节的uchar类型,其他的类似;C(n)代表通道数,当n=1时,即构造单通道矩阵或二维矩阵,当n>1时,即构造多通道矩阵或三维矩阵
Mat(Size(int cols, int rows), int type);

其中:

  • Size的第一个参数代表矩阵的列数,第二个参数代表矩阵的行数
  • type:代表类型,包括通道数及其数据类型

二.构造单通道Mat对象

以构造2行3列的矩阵为例:

  1. 通过矩阵的行、列构造Mat对象

    Mat m = Mat(2, 3, CV_32FC(1));
    
  2. 借助Size对象构造Mat对象

    Mat m = Mat(Size(3,2), CV_32FC(1));
    
  3. 使用Mat中的成员函数create完成Mat对象的构造

    Mat m;
    m.create(2, 3, CV_32FC(1));
    

    或者

    Mat m;
    m.create(Size(3, 2), CV_32FC(1));
    
  4. 构造全0矩阵

    Mat m = Mat::zeros(Size(3, 2), CV_32FC(1));
    
  5. 构造全1矩阵

    Mat m = Mat::ones(2, 3, CV_32FC(1));
    
  6. 构造小型矩阵

    Mat m = (Mat_(2, 3) << 1,2,3,4,5,6);
    

三.获取单通道Mat的基本信息

以下面的3行2列的二维矩阵为例:
k e r n e l = [ 11 12 33 43 51 16 ] kernel= \left[ \begin{matrix} 11 & 12\\ 33 & 43\\ 51 & 16 \end{matrix} \right] kernel=113351124316

  • 获取矩阵的行数和列数

    Mat m = (Mat(3,2) << 11,12,33,43,51,16);
    //矩阵的行数
    int rows = m.rows;
    //矩阵的列数
    int cols = m.cols;
    
  • 使用成员函数Size()获取矩阵的尺寸

    Mat m = (Mat(3,2) << 11,12,33,43,51,16);
    Size size = m.size();
    cout << "尺寸:" << size << endl;  //输出结果为: "尺寸:[2x3]"
    
  • 使用成员函数channels()得到矩阵的通道数

    Mat m = (Mat(3,2) << 11,12,33,43,51,16);
    cout << "通道数:" << m.channels() << endl;  //输出结果为: "通道数:1"
    
  • 通过成员函数total()获取矩阵的面积(行数乘以列数)

    Mat m = (Mat(3,2) << 11,12,33,43,51,16);
    cout << "面积:" << m.total() << endl;  //输出结果为: "面积:6"
    
  • 成员变量dims,即矩阵的维数,对于单通道Mat是一个二维矩阵,对于多通道Mat是一个三维矩阵

    Mat m = (Mat(3,2) << 11,12,33,43,51,16);
    cout << "维数:" << m.dims << endl;  //输出结果为: "维数:2"
    

四.构造多通道Mat对象

构造一个n个通道,rows行,cols列的浮点型Mat对象,形式如下:

Mat(int rows, int cols, CV_32FC(n));

当n=1时,就变成了单通道Mat,比如构造一个2行2列的float类型的三通道矩阵:

Mat m = (Mat(2, 2) << Vec3f(1,11,21), Vec3f(2,12,22), Vec3f(3,13,23), Vec3f(4,14,24));

你可能感兴趣的:(Opencv算法系列)