[OpenCV3编程入门读书笔记]基础图像容器Mat(2)

Mat是一个类,由两个数据部分组成,分别是矩阵头和一个指向存储矩阵所有像素值的矩阵,其中矩阵头包含了矩阵尺寸,存储方法,存储地址等信息。

对于OpenCV1.X时代基于C语言构建的图像存储格式IplImage*,如果在退出之前忘记release就会造成内存泄漏。而在OpenCV2.0之后的版本,使用了Mat结构取而代之,OpenCV变得像MATLAB那样上手很方面。

关于Mat类:

(1)不必手动开辟空间

(2)不必在不再需要的时候立即释放掉

赋值运算符和拷贝构造函数只复制信息头,不是深拷贝。

Mat A ,C; //仅创建信息头部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR); //这里为矩阵开辟内存
Mat B(A); //使用拷贝构造函数
C = A; //赋值运算符

使用函数clone()或者copyTo()可以深拷贝。

Mat F = A.clone();
Mat G;
A.copyTo(G);

创建一个感兴趣区域只要创建包含边界信息的信息头。

Mat D(A,Rect(10,10,100,100));//使用矩形界定
Mat E = A(Range:all(),Range(1,3)); //使用行和列界定

创建Mat对象的七种方式:

  1. 使用Mat()构造函数
    Mat M(2,2,CV_8UC3,Scalar(0,0,255));
  2. 在C/C++中通过构造函数进行初始化
    int sz[3] = {2,2,2};
    Mat L(3,sz,CV_8UC3,Scalar::all(0));

    上面的例子展示了如何创建一个超过二维的矩阵,第二参数传递了一个指向数组的指针,这个数组包含了每个维度的尺寸。

  3. 为已存在的IplImage指针创建信息头 
  4. 利用Create()函数
    M.Create(4,4,,CV_8UC(2));
  5. 采用Matlab的初始化方式:包括zeros(),ones(),eyes()。
    Mat E = Mat::eye(4,4,CV_64F); //单位矩阵
    Mat E = Mat::ones(4,4,CV_64F); 
    Mat E = Mat::zeros(4,4,CV_64F);
    
  6. 对小矩阵使用逗号分隔式初始化函数
    Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    
  7. 为已存在的对象创建新的信息头
    Mat RowClone = C.row(1).clone();

猜你喜欢

转载自blog.csdn.net/sinat_33487968/article/details/84572712