opencv之Mat类

来源:互联网 发布:知乎 恐惧 编辑:程序博客网 时间:2024/04/30 11:08

      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);

0 0