第三课 Mat对象
Mat对象与IplImage对象
·Mat对象Opencv2.0之后引进的图像数据结构、自动分配内存,不存在内存泄露的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。
·IplImage是从2001年Opencv发布后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用他容易导致内存泄露问题
Mat对象构造函数与常用方法
Mat()
Mat(int rows, int cols, int type)
Mat(Size size, int type)
Mat(int rows, int cols, int type, const Scalar &s)
Mat(Size size, int type, const Scalar &s)
Mat(int ndims, const int *sizes, int type)
Mat(int ndims, const sizes, int type, const Scalar &s)
常用方法:
void copyTo(Mat mat)
void convertTo(Mat dst, int type)
Mat clone()
int channels()
int depth()
bool empty()
uchar ptr(i=0)
Mat对象使用
·部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分。
Mat A=imread(imgFilePath);
Mat B(A)//只复制
·完全复制:若果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
Mat F=A.clone();或Mat G;A.copyTo(G);
Mat对象使用-四个要点
·输出图像的内存是自动分配的
·使用Opencv的C++接口,不需要考虑内存分配的问题
·赋值操作和拷贝构造函数只会复制头部分
·使用clone与copyTo两个函数实现数据完全复制
Mat对象创建
·cv::Mat::Mat构造函数
Mat M(2,2,CV_8UC3,Scalar(0,0,255)),其中前两个参数分别表示行row跟列column、第三个CV_8UC3中的8表示每个通道占8位,U表示无符号,C表示Char类型、3表示通道数目是3、第四个参数是向量表示初始化每个像素值是多少,向量疮毒对应通道数目一致。
·创建多维数组cv::Mat::create
int sz[3]={2,2,2};
Mat L(3,sz,CV_8UC1,Scalar::all(0)); //了解就好了
//提高对比度
Mat C=(Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
cout <<“C=”<<endl<<" "<<C<<endl<<endl;