OpenCV里面Mat方法中的Scalar详解

 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(行,列,类型(值))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值