OpenCV之显式创建Mat对象的几种方法(C++实现)
目录1、使用Mat()构造函数2、在C/C++中通过构造函数进行初始化3、为已存在的IplImage指针创建信息头4、利用create()函数5、采用matlab式的初始化方式: zeros(), ones(), eyes()6、对小矩阵使用逗号分隔式初始化函数7、为已存在的的对象创建新信息头Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类,我们也可以用它来创建和操作多维矩阵。创建一
目录
5、采用matlab式的初始化方式: zeros(), ones(), eyes()
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]
更多推荐
所有评论(0)