【学习记录】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小结:
  1. OpenCV中输出图像的内存分配和释放都是自动的,不需要内存管理操作;
  2. 赋值运算符和复制构造函数仅复制矩阵头,矩阵指针还是同一个;
  3. 使用clone() 和 copyTo()进行复制操作。
 

2. 四种颜色系统(颜色空间)

  1. RGB:最常用,不过注意OpenCV使用BGR的顺序
  2. HSV:色相、饱和度和亮度,描述颜色更方便,例如忽略最后一个分量,使得算法对图像的光照条件不敏感。
  3. YCrCb:用于JPEG图像。
  4. CIE L*a*b:感知系统中同意的颜色空间,测量两个颜色间的距离时,可以用到。
 
 

3. 创建与显示Mat对象

二维矩阵用<<操作符就可以显示;通过设定,输出可以有不同模式的选择。
 
有很多种方式可以创建Mat对象:
 
  1. 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]
 
  1. C++数组 结合 构造函数
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC(1), Scalar::all(0));
 
  1. Mat.create()函数
M.create(4,4, CV_8UC(2)); //4*4,二通道
cout << "M = "<< endl << " " << M << endl << endl;
注意:不可以用在初始化时;如果新的矩阵大小不适合旧的大小,会重新分配内存。
 
  1. MATLAB风格(这里不赘述)
 
  1. 小矩阵,可以直接用逗号分隔数字进行初始值设定
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;
 
  1. 通过复制(同上深拷贝)
 
 
 

 二、扫描图像