目录

1、使用Mat()构造函数

2、在C/C++中通过构造函数进行初始化

3、为已存在的IplImage指针创建信息头

4、利用create()函数

5、采用matlab式的初始化方式: zeros(), ones(), eyes()

6、对小矩阵使用逗号分隔式初始化函数

7、为已存在的的对象创建新信息头


Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类,我们也可以用它来创建和操作多维矩阵。

创建一个Mat对象有多正方法,列举如下。

1、使用Mat()构造函数

最常用的方法是直接使用Mat()构造函数,这种方法简单明了,示例代码如下:

//    方法一:直接使用Mat()构造函数
    Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
    cout << M << endl;

运行结果为:

[  0,   0, 255,   0,   0, 255;
        0,   0, 255,   0,   0, 255]

对于二维多通道图像,首先定义其尺寸,即行数和列数,然后需要制定存储元素的类型及通道数,根据下面的规则有多种定义:

CV_[位数][带符号与否][类型前缀]C[通道数]

比如CV_8UC3表示使用8位的unsigned char型,图像有3个通道,预先定义的通道数最多可以是4个。Scalar是short型向量,能使用指定的定制化值来初始化矩阵,它还可以用于表示颜色。

如果需要更多的通道数,则可以使用大写的宏并把通道数放在小括号中。

2、在C/C++中通过构造函数进行初始化

这方法位在C/C++通过构造函数进行初始化,示例代码:

//    方法二:在C/C++中通过构造函数进行初始化
    int sz[3] = {2, 2, 2};
    Mat L(3, sz, CV_8UC3, Scalar::all(0));

上面的代码为如何创建一个超过两维的矩阵:指定位数,然后传递一个指向数组的指针,这个数组包含每个维度的尺寸。

3、为已存在的IplImage指针创建信息头

示例代码:

//    方法三:为已存在的IplImage指针创建信息头
    IplImage* img = cvLoadImage("1.jpg");
    Mat mtx(img);

这种方法不能为矩阵设初值,只是在改变尺寸时重新为矩阵开辟内存。

4、利用create()函数

示例代码;

//     方法四:利用create函数
    M.create(4, 4, CV_8UC(2));
    cout << M << endl;

运行结果:

[  0,   0,   0,   0,   1,   0,   0,   0;
           0,   0,   0,   0,   0,   0,   0,   0;
           0,   0,   0,   0,   0,   0,   0,   0;
           0,   0,   0,   0,   0,   0,   0,   0]

这种方法不能为矩阵设初值,只是在改变尺寸时重新为矩阵开辟内存而已。

5、采用matlab式的初始化方式: zeros(), ones(), eyes()

    Mat E = Mat::eye(4, 4, CV_64F);
    Mat O = Mat::ones(4, 4, CV_32F);
    Mat Z = Mat::zeros(4, 4, CV_8UC1);

6、对小矩阵使用逗号分隔式初始化函数

代码:

    Mat C = (Mat_<double>(3, 3) << 0, 1, 2, 3, 4, 5, 6, 7, 8);
    cout << C << endl;

结果:

[0, 1, 2;
        3, 4, 5;
        6, 7, 8]

7、为已存在的的对象创建新信息头

该方法为使用成员函数 clone()或copyTo()为一个已存在的Mat对象创建一个新的信息头,代码:

    Mat RowClone = C.row(1).clone();
    cout << RowClone << endl;

结果:

[3, 4, 5]

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐