Mat不再需要手动分配内存,并且在不需要时立即释放它。
Mat是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,矩阵存储的地址)
指向包含像素值的矩阵的指针。
Opencv使用了一个引用技术系统。每个Mat对象都有自己的标头,可以通过让他们的矩阵指针指向同一地址在两个Mat对象之间共享矩阵。复制运算符只会复制指向大矩阵的标头和指针,而不是数据本身。
Mat A,c; //creates just the header parts
A = imread(argv[1], IMREAD_COLOR); //here we'll know the method used (allocate matrix)
Mat B(A); //use the copy constructor
C = A; //Assignment operator
/*
A C对象都指向同一个数据矩阵,使用其中任何一个修改也会影响另外一个,不同的对象只是为相同的数据提供不同的访问方法。
*/
//创建感兴趣区域
Mat D(A, Rect(10, 10, 100, 100)); //using a rectangle
Mat E = A(Range::all(), Range(1,3)); //using row and column boundaries
复制矩阵本身,cv::Mat::clone()函数 cv::Mat::copyTp()函数
Mat F = A.clone();
Mat G;
A.copyTo(G);
/*
1.Opencv的输出图像是自动的
2.不需要考虑opencv的C++接口进行内存管理
3.赋值操作和复制构造函数只复制头
4.可以使用cv::Mat::clone()函数和cv::Mat::copyTp()函数构建图像矩阵
*/
颜色系统:
(1)Opencv标准显示系统使用BGR颜色空间组成颜色。
(2)HSV和HLS将颜色分解为色相,饱和度和值、亮度组件 。
(3)YCrCb被流行的JPEG图像格式所使用。
(4)CIE L*a*b*是一个感知上均匀的颜色空间,用于测量一种颜色到另一种颜色的距离。
cv::Mat::Mat 构造
Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255))
//Scalar()函数用来设置颜色,(0, 0, 255)为红色
cout << "M = " << endl << " " << M << endl << endl;
/*
CV_8UC3含义:
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
*/
int sz[3] = {2, 2, 2};
Mat L(3, sz, CV_8UC(1), Scalae::all(0));