opencv之Mat类
2014-04-28 16:34
295 查看
Mat类是opencv中最重要最基本的数据类型,它是由两个部分组成的类:包括数据头和一个数据指针,数据头包含有矩阵大小,存储方法等信息,数据指针则指向矩阵的储存地址。
这也是Mat类最大的特点。在数字opencv中,一副图像往往包含巨大的数据量,在进行参数传递时如果生成图像副本将付出很大的时间空间代价,而且这些参数传递中图像副本的创建往往是不必要的。Mat类使用了一种非常巧妙的办法来避免创建图像副本带来的弊端,它在创建新的Mat类拷贝时只创建一个新的数据头,而数据指针仍指向原来的矩阵,这就意味着新创建的图像拷贝和原图像共享数据区,而不用建立图像副本。如果想要建立图像副本的话,Mat类也提供了相应的函数供使用者建立图像副本,例如clone(),和copyto()。
Mat类与c语言中的IplImage不同之处在于Mat类实现了自动的内存管理,使用者不必手动控制内存的开辟和释放,当然相比于IplImage的手动管理要方便很多,当然,必要情况下Mat类也还是可以进行手动的内存管理的。
接下来就来看看Mat类包含有哪些信息。
1、矩阵头
Class CV_EXPORTS Mat
{
Public:
intflags; //矩阵的维度
int dims; //行列数,如果超过二维则为(-1,-1)
int rows,cols;//行和列数
uchar *data;//数据块的起始地址
int *refcount;//其他成员
}
注:CV_EXPORTS是声明导出类的意思,它的作用是是外部能够使用该类的全部功能,具体含义不必深究,不影响使用。
2、Mat类的相关操作
(1)常用的Mat类初始化方式
Mat M(nrows,ncols,type,fillValue); 例如:Mat M(7,7,CV_32FC2,Scalar(1,3));
M.create(nrows,ncols,type);
Mat M1=M.col(1);
Int sz[]={100,100,100};Mat M(3, sz, CV_8U,Scalar::all(0)); //sz[]被转化为一维
Mat roi(img,Rect(10,10,100,100));
Mat M1=M.clone();
Mat M1; copyTo(M1,M);
(2)常用矩阵操作
M.t(); //转置
M.inv(); //求逆
M.mul(M1); //矩阵乘
M.cross(M1); //叉积
M.dot(M1); //点积
(3)向量操作
M.push_back(elem);
M.pop_back();
(4)获得属性操作
M.isContinuous();
M.total(); //矩阵数据元素的个数
M.elemSize(); //每一个点的数据位数
M.elemSize1(); //每一个点的每一个通道的数据位数
M.type(); //数据类型,例如:CV_16SC3
M.depth(); //维度
M.channels(); //通道数
M.step(); //图像像素行的实际宽度
M.size(); //返回Size(rows,cols),size().x,size().y
M.empty(); //空则返回true
(4)指针与位置
M.ptr<typename>(i);//第i行指针
M.at(int i,int j,int k); //该位置像素值
M.at(int *idx);
M.begin(); //矩阵头指针
M.end(); //矩阵最后一个元素的后一个指针
(5)Mat_子类
Mat_<typename> M; //M(x,y)=M1.at(x,y);
这也是Mat类最大的特点。在数字opencv中,一副图像往往包含巨大的数据量,在进行参数传递时如果生成图像副本将付出很大的时间空间代价,而且这些参数传递中图像副本的创建往往是不必要的。Mat类使用了一种非常巧妙的办法来避免创建图像副本带来的弊端,它在创建新的Mat类拷贝时只创建一个新的数据头,而数据指针仍指向原来的矩阵,这就意味着新创建的图像拷贝和原图像共享数据区,而不用建立图像副本。如果想要建立图像副本的话,Mat类也提供了相应的函数供使用者建立图像副本,例如clone(),和copyto()。
Mat类与c语言中的IplImage不同之处在于Mat类实现了自动的内存管理,使用者不必手动控制内存的开辟和释放,当然相比于IplImage的手动管理要方便很多,当然,必要情况下Mat类也还是可以进行手动的内存管理的。
接下来就来看看Mat类包含有哪些信息。
1、矩阵头
Class CV_EXPORTS Mat
{
Public:
intflags; //矩阵的维度
int dims; //行列数,如果超过二维则为(-1,-1)
int rows,cols;//行和列数
uchar *data;//数据块的起始地址
int *refcount;//其他成员
}
注:CV_EXPORTS是声明导出类的意思,它的作用是是外部能够使用该类的全部功能,具体含义不必深究,不影响使用。
2、Mat类的相关操作
(1)常用的Mat类初始化方式
Mat M(nrows,ncols,type,fillValue); 例如:Mat M(7,7,CV_32FC2,Scalar(1,3));
M.create(nrows,ncols,type);
Mat M1=M.col(1);
Int sz[]={100,100,100};Mat M(3, sz, CV_8U,Scalar::all(0)); //sz[]被转化为一维
Mat roi(img,Rect(10,10,100,100));
Mat M1=M.clone();
Mat M1; copyTo(M1,M);
(2)常用矩阵操作
M.t(); //转置
M.inv(); //求逆
M.mul(M1); //矩阵乘
M.cross(M1); //叉积
M.dot(M1); //点积
(3)向量操作
M.push_back(elem);
M.pop_back();
(4)获得属性操作
M.isContinuous();
M.total(); //矩阵数据元素的个数
M.elemSize(); //每一个点的数据位数
M.elemSize1(); //每一个点的每一个通道的数据位数
M.type(); //数据类型,例如:CV_16SC3
M.depth(); //维度
M.channels(); //通道数
M.step(); //图像像素行的实际宽度
M.size(); //返回Size(rows,cols),size().x,size().y
M.empty(); //空则返回true
(4)指针与位置
M.ptr<typename>(i);//第i行指针
M.at(int i,int j,int k); //该位置像素值
M.at(int *idx);
M.begin(); //矩阵头指针
M.end(); //矩阵最后一个元素的后一个指针
(5)Mat_子类
Mat_<typename> M; //M(x,y)=M1.at(x,y);
相关文章推荐
- 对OpenCV中的Mat类的初步认识
- opencv--Mat类解析
- OpenCV参考手册之Mat类详解2 .
- opencv的Mat类基本操作
- opencv Mat类存储RGB图像出现访问异常
- OpenCV 之Mat类详解
- Opencv学习笔记:Mat类详解(一)
- OpenCV入门教程(5)-Mat类之Mat_类
- OpenCV参考手册之Mat类详解1
- OpenCV参考手册之Mat类详解
- openCV中Mat类的图像如何设置ROI
- opencv的Mat类
- 图像识别与处理之Opencv——Mat类
- 【opencv3】 Mat类用法总结
- opencv3学习之Mat类
- 图像识别入门(opencv入门)Mat类的学习
- OpenCV,详解基本图像容器Mat类与IplImage结构体(三)
- OpenCV(三) Opencv中 core 核心模块详解—— Mat类(一)
- OpenCV中Mat类的重载运算符operator()的用法!
- OpenCV参考手册之Mat类详解(三)