OpenCV参考手册2.3.1中第15页,有这么一个例子:
// make a 7x7 complex matrix filled with 1+3j.
Mat M(7,7,CV_32FC2,Scalar(1,3));
解释如下:创建一个M矩阵,7行7列,类型为CV_32F,C2表示有2个通道。Scalar(1,3)是对矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。具体见一下:
转自:http://blog.csdn.net/xiaojidan2011/article/details/8044602
今早看opencv manual,偶然发现一个有趣的函数Scalar,以前给图像赋颜色赋值时候也是用到这个函数。
今天这个函数还可以这样使用,真是不看不知道,一看很霸气!!
Mat M(7,7,CV_32FC2,Scalar(1,3));
OpenCV里面Mat方法中的Scalar详解 - 飘锅 - 飘锅~~的博客
Mat M(7,7,CV_32FC1,Scalar(1,3));
OpenCV里面Mat方法中的Scalar详解 - 飘锅 - 飘锅~~的博客
Mat M(7,7,CV_32FC3,Scalar(1,3));
OpenCV里面Mat方法中的Scalar详解 - 飘锅 - 飘锅~~的博客
具体见opencv manual pp15,很精彩~~~~
----------------------------------------------------------------------------------------------------------------------------------
转自:http://blog.csdn.net/giantchen547792075/article/details/7061391
Mat::Mat
各种Mat构造函数。
C++: Mat::Mat()
C++: Mat::Mat(int rows, int cols, int type)
C++: Mat::Mat(Size size, int type)
C++: Mat::Mat(int rows, int cols, int type,const Scalar& s)
C++: Mat::Mat(Size size, int type, constScalar& s)
C++: Mat::Mat(const Mat& m)
C++: Mat::Mat(int rows, int cols, int type,void* data, size_t step=AUTO_STEP)
C++: Mat::Mat(Size size, int type, void*data, size_t step=AUTO_STEP)
C++: Mat::Mat(const Mat& m, constRange& rowRange, const Range& colRange)
C++: Mat::Mat(const Mat& m, constRect& roi)
C++: Mat::Mat(const CvMat* m, boolcopyData=false)
C++: Mat::Mat(const IplImage* img, boolcopyData=false)
C++: template<typename T, int n>explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)
C++: template<typename T, int m, intn> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)
C++: template<typename T> explicitMat::Mat(const vector<T>& vec, bool copyData=false)
C++: Mat::Mat(const MatExpr& expr)
C++: Mat::Mat(int ndims, const int* sizes,int type)
C++: Mat::Mat(int ndims, const int* sizes,int type, const Scalar& s)
C++: Mat::Mat(int ndims, const int* sizes,int type, void* data, const size_t* steps=0)
C++: Mat::Mat(const Mat& m, constRange* ranges)
参数
ndims– 数组的维数.
rows – 2维数组中行行数
cols – Number of columnsin a 2D array.
size – 2维数组的尺寸Size(cols, rows) .在Size()构造函数中行数和列数在次序上刚好反转过来了。
sizes–指定 n 维数组形状的整数数组。
type–数组的类型。使用 CV_8UC1,… …,创建 1-4 通道的矩阵,CV_64FC4 或CV_8UC(n),… …,CV_64FC(n)可以创建多通道 (高达 CV_MAX_CN 通道)矩阵。
s–一个可选的初始化每个矩阵元素的参数。要在矩阵建成后将所有元素设置为特定值可以用Mat的赋值运算符Mat:operator=(constScala& value)。
data–指向用户数据的指针。矩阵构造函数传入data和step参数不分配矩阵数据。相反,它们只是初始化矩阵头指向指定的数据,这意味着没有数据的复制。此操作是很高效的,可以用来处理使用 OpenCV 函数的外部数据。外部数据不会自动释放,所以你应该小心处理它。
step–每个矩阵行占用的字节数。如果任何值应包括每行末尾的填充字节。如果缺少此参数(设置为 AUTO_STEP),假定没有填充和实际的步长用cols*elemSize()计算。请参阅Mat::elemSize()。
steps–多维数组(最后一步始终设置为元素大小) 的情况下的 ndims-1个步长的数组。如果没有指定的话,该矩阵假定为连续。
m–分配给构造出来的矩阵的阵列(作为一个整体或部分)。这些构造函数没有复制数据。相反,指向 m 的数据或它的子数组的头被构造并被关联到m上。引用计数器中无论如何都将递增。所以,当您修改矩阵的时候,自然而然就使用了这种构造函数,您还修改 m 中的对应元素。如果你想要独立的子数组的副本,请使用 Mat::clone()。
img –指向老版本的 IplImage图像结构的指针。默认情况下,原始图像和新矩阵之间共享数据。但当 copyData 被设置时,完整的图像数据副本就创建起来了。
vec–矩阵的元素构成的STL 向量。矩阵可以取出单独一列并且该列上的行数和矢量元素的数目相同。矩阵的类型匹配的向量元素的类型。构造函数可以处理任意的有正确声明的DataType类型。这意味着矢量元素不支持的混合型结构,它们必须是数据(numbers)原始数字或单型数值元组。对应的构造函数是显式的。由于 STL 向量不会自动转换为Mat实例,您应显式编写 Mat(vec)。除非您将数据复制到矩阵 (copyData = true),没有新的元素被添加到向量中,因为这样可能会造成矢量数据重新分配,并且因此使得矩阵的数据指针无效。
copyData –指定STL 向量或旧型 CvMat 或 IplImage是应复制到 (true)新构造的矩阵中 还是 (false) 与之共享基础数据的标志,复制数据时,使用Mat引用计数机制管理所分配的缓冲区。虽然数据共享的引用计数为 NULL,但是分配数据必须在矩阵被析构之后才可以释放。
rowRange – m 的行数的取值范围。正常情况下,范围开始端具有包容性和范围结束端是独占的。使用 Range::all() 来取所有的行。
colRange –m 列数的取值范围。使用 Range::all() 来取所有的列。
ranges –表示M沿每个维度选定的区域的数组。
expr – 矩阵表达式。请参见矩阵表达式。
以上这些都是Mat形成一个矩阵的各类构造函数。如输出数据的自动分配中所提到的,往往默认构造函数就足够了,不同的矩阵可以由 OpenCV 函数来分配数据空间。构造的矩阵可以进一步分配给另一个矩阵或矩阵表达或通过Mat::create()获配。在前一种情况,旧的内容是间接引用的。
---------------------------------------------------------------------------------------------------------------
转自:http://blog.csdn.net/yang_xian521/article/details/7107786
Mat_<uchar>对应的是CV_8U,
Mat_<char>对应的是CV_8S,
Mat_<int>对应的是CV_32S,
Mat_<float>对应的是CV_32F,
Mat_<double>对应的是CV_64F,对应的数据深度如下:
? CV_8U - 8-bit unsigned integers ( 0..255 )
? CV_8S - 8-bit signed integers ( -128..127 )
? CV_16U - 16-bit unsigned integers ( 0..65535 )
? CV_16S - 16-bit signed integers ( -32768..32767 )
? CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
? CV_32F - 32-bit ?oating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
? CV_64F - 64-bit ?oating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
这里还需要注意一个问题,很多OpenCV的函数支持的数据深度只有8位和32位的,所以要少使用CV_64F,但是vs的编译器又会把float数据自动变成double型,有些不太爽。
还有个需要注意的问题,就是流操作符<<对于Mat的操作,仅限于Mat是2维的情况。
还有必要说一下Mat的存储是逐行的存储的。
再说说Mat的创建,方式有两种,罗列一下:1.调用create(行,列,类型)2.Mat(行,列,类型(值))。