Mat类是OpenCV的C++接口的图像存储类,不必像C接口的IplImage那样要创建释放内存,不用担心内存释放问题,上手快。
Mat类由两部分组成:矩阵头(矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。因为大图像的复制会降低程序的运行速度,为了解决这个问题,引入计数机制。思路是让每个Mat对象有自己的信息头,但共享同一个矩阵,让图像矩阵指向同一指针即可。
Mat A,C;
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//这里为矩阵开辟内存
Mat b(A);//使用拷贝构造函数
C = A;
代码中所有Mat对象都指向同一个数据矩阵。
要想建一个感兴趣区域,只需要包括边界信息的信息头:
Mat D(A,Rect(10,10,100,100)); //使用矩形界定
Mat E = A(Range:all(),Range(1,3)); //使用行和列来界定
真想赋值矩阵就copyTo或者clone()。
Mat F = A.clone();
Mat G;
A.copyTo(G);
在存储图像的时候,颜色系统是要设置的。
RGB:红绿蓝
HSV和HLS把颜色分为色调、饱和度和亮度/明度,这种最后一个元素不用的话,使算法对输入图像的光照条件不敏感。
YCrCb即YUV,亮度和色度,这是PAL制式的,电视机颜色空间。
CIE Lab亮度加四个颜色,是感知上均匀的颜色空间,适合用来度量两个颜色之间的距离。
图像元素数据类型:char占一个字节或8位,可以是无符号型(0与255之间)或有符号型(-127到+127)。三个char型元素已经可以表示1600万种可能的颜色。 int:16位;float:4字节,32位;double:8字节,64字节。
显式创建Mat对象的七种方法:
1:Mat M(2,2,CV_8UC3,Scalar(0,0,255));
2:int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));
3:IplImage* img = cvLoadImage("1.jpg",1);
Mat mtx(img); //转换IplImage*->Mat
4: M.create(4,4,CV_8UC(2));
5: Mat E = Mat::eye(4,4,CV_64F);
Mat O = Mat::ones(2,2,CV_32F);
Mat z = Mat::zeros(3,3,cv_8UC1);
6: Mat C = (Mat_(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
7: Mat RowClone = C.row(1).clone();
数据元素可以通过randu()函数产生的随机数填充矩阵。
OpenCV的格式化输出风格
cout <<"r(OpenCV默认风格) = " << r << "," << endl <format(r,"python") 或者csv,numpy,C等风格。