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


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCVMat是一个重要的数据类型,它是用来存储图像的。Mat可以看作是一个多维数组,它包含了图像的像素数据以及图像的元数据(如图像的大小,通道数,数据类型等)。 Mat的常用构造函数有以下几种: 1. Mat(): 创建一个空的Mat对象。 2. Mat(int rows, int cols, int type): 创建一个指定大小和类型的Mat对象。 3. Mat(Size size, int type): 创建一个指定大小和类型的Mat对象。 4. Mat(int rows, int cols, int type, Scalar s): 创建一个指定大小和类型,并用指定颜色初始化的Mat对象。 5. Mat(Size size, int type, Scalar s): 创建一个指定大小和类型,并用指定颜色初始化的Mat对象。 6. Mat(const Mat& m): 创建一个与给定Mat对象大小和类型相同的Mat对象,并复制给定对象的数据。 Mat的一些常用方法: 1. Mat::at(): 用于访问Mat对象的像素值。 2. Mat::clone(): 创建一个与原Mat对象大小和类型相同的新对象,并将原对象数据复制到新对象。 3. Mat::convertTo(): 将Mat对象的像素值转换成指定的数据类型。 4. Mat::copyTo(): 复制一个Mat对象到另一个Mat对象。 5. Mat::reshape(): 改变Mat对象的大小和通道数。 6. Mat::rows(): 返回Mat对象的行数。 7. Mat::cols(): 返回Mat对象的列数。 8. Mat::size(): 返回Mat对象的大小。 9. Mat::type(): 返回Mat对象的数据类型。 以下是一个简单的Mat的例子: ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("lena.jpg", IMREAD_COLOR); if (image.empty()) { return -1; } Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); imshow("原图", image); imshow("灰度图", gray_image); waitKey(); return 0; } ``` 这段代码读取了一张彩色图像,将其转换为灰度图像,并显示在窗口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值