虽然Mat是一个伟大的图像容器类,它也是一般矩阵类。因此,利用Mat创建和操作多维矩阵是可能的。您可以通过多种方式创建Mat的对象:
? Mat()构造函数
Mat M(2,2, CV_8UC3, Scalar(0,0,255));
cout << "M = " << endl << " " << M << endl << endl;
对于二维的和多通道的图像,我们首先定义它们的大小:按行和列计数。
然后我们需要指定的数据类型,用于存储元素和每个矩阵点通道的数量。为此,我们根据以下的约定可以作出多个定义:
CV_ [每一项的位数] [有符号或无符号] [类型前缀] C [通道数]
例如,CV_8UC3 意味着我们使用那些长的 8 位无符号的 char 类型和每个像素都有三个项目的这三个通道的形成。这是预定义的四个通道数字。Scalar 是四个元素短向量。指定此和可以初始化所有矩阵点与自定义的值。但是如果你需要更多您可以创建与上部宏和频道号码放在括号中,您可以看到下面的类型。
使用 C\C++ 数组和通过构造函数来初始化
上例为我们展示了如何创建一个二维以上的矩阵。首先指定其维度数,然后传入一个包含了尺寸每个维度信息的指针,其他都保持不变。
?为一个已经存在的IplImage创建一个头:
IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // 转换 IplImage*-> Mat
? Create()函数:
M.create(4,4, CV_8UC(2));
cout << "M = "<< endl << " " << M << endl << endl;
你不能通过这个构造来初始化矩阵中的数值。它只会在新的居住尺寸与旧的矩阵尺寸不合时重新分配矩阵的数据空间。
? MATLAB风格的初始化函数:zeros(), ones(),eyes().指定使用的尺寸和数据类型
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
?为一个已有的Mat对象创建一个新的头然后clone()或者copyTo()这个头.
Mat RowClone = C.row(1).clone();
cout << "RowClone = " << endl << " " << RowClone << endl << endl;
打印格式
注意:你可以通过用randu()函数产生的随机值来填充矩阵。你需要给定一个上限和下限来确保随机值在你期望的范围内:
Mat R = Mat(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));
在上一个例子中你可以看到默认的格式选项。尽管如此,OpenCV允许你在符合以下规则的同时格式化你的输出:
? 默认
cout << "R (default) = " << endl << R << endl << endl;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-65348-3.html
中国大地思想的大旗又高高举起和飘扬了