【学习记录】OpenCV文档 - Core部分
一、Mat基础
1. Mat
Mat分为矩阵头和指向矩阵内容的指针两部分,矩阵头长度是固定的。
Mat的浅拷贝:
-
拷贝构造函数和赋值运算符都是浅拷贝;
-
其意义是两个Mat拥有自己的矩阵头,但是矩阵指针指向同一地址,来共享同一个矩阵。
-
所以改变其中一个也会影响另一个。
Mat A, C;
A = imread(argv[1], IMREAD_COLOR);
Mat B(A); //拷贝构造函数
C = A; //赋值运算符
通过浅拷贝,可以创建ROI(Region of Interest)感兴趣区域
-
其原理是创建新的矩阵头,矩阵指针指向一个完整矩阵的某一部分
-
通过在拷贝构造函数或者赋值运算时,加上边界信息实现
Mat D (A, Rect(10, 10, 100, 100) ); //矩形,坐标(10,10)为左上角,长100,宽100
Mat E = A(Range::all(), Range(1,3)); //行全选,列从1到3
OpenCV使用引用计数机制清理矩阵,如果没有Mat对象引用这个矩阵,此时计数器为0,矩阵被释放。
Mat的深拷贝:
-
clone() 和 copyTo() 函数用于深拷贝
-
完全复制为另一个矩阵,操作不会对另一个造成影响
Mat F = A.clone();
Mat G;
A.copyTo(G);
Mat小结:
-
OpenCV中输出图像的内存分配和释放都是自动的,不需要内存管理操作;
-
赋值运算符和复制构造函数仅复制矩阵头,矩阵指针还是同一个;
-
使用clone() 和 copyTo()进行复制操作。
2. 四种颜色系统(颜色空间)
-
RGB:最常用,不过注意OpenCV使用BGR的顺序
-
HSV:色相、饱和度和亮度,描述颜色更方便,例如忽略最后一个分量,使得算法对图像的光照条件不敏感。
-
YCrCb:用于JPEG图像。
-
CIE L*a*b:感知系统中同意的颜色空间,测量两个颜色间的距离时,可以用到。
3. 创建与显示Mat对象
二维矩阵用<<操作符就可以显示;通过设定,输出可以有不同模式的选择。
有很多种方式可以创建Mat对象:
-
Mat构造函数
Mat M(2,2, CV_8UC3, Scalar(0,0,255));
cout << "M = " << endl << " " << M << endl << endl;
以上构造了一个2*2的, 8位无符号,三通道,初始化为(0,0,255) 的矩阵。
CV_属性构造如下:
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
-
C++数组 结合 构造函数
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC(1), Scalar::all(0));
-
Mat.create()函数
M.create(4,4, CV_8UC(2)); //4*4,二通道
cout << "M = "<< endl << " " << M << endl << endl;
注意:不可以用在初始化时;如果新的矩阵大小不适合旧的大小,会重新分配内存。
-
MATLAB风格(这里不赘述)
-
小矩阵,可以直接用逗号分隔数字进行初始值设定
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
C = (Mat_<double>({0, -1, 0, -1, 5, -1, 0, -1, 0})).reshape(3);
cout << "C = " << endl << " " << C << endl << endl;
-
通过复制(同上深拷贝)