04_Opencv之Mat对象

04_Opencv之Mat对象

一.Mat对象与IplImage对象

  • Mat对象:自动分配内存,不存在内存泄露的问题,分为头部与数据部分
  • IplImage对象:需要自己分配与管理内存,容易导致内存泄漏问题

二.Mat构造函数

    Mat();    // 默认构造函数
    Mat(int rows, int cols, int type);   //指定行数、列数、类型的构造函数
    Mat(Size size, int type);     // 指定矩阵大小、类型的构造函数
    Mat(int rows, int cols, int type, const Scalar& s);    // 指定矩阵行列、类型、颜色的构造函数
    Mat(Size size, int type, const Scalar& s);// 指定矩阵大小、类型、颜色的构造函数
    Mat(int ndims, const int* sizes, int type);
    Mat(int ndims, const int* sizes, int type, const Scalar& s);
    Mat(const Mat& m);
    Mat m1;//m1使用默认的构造方法
    cout << "m1 = " << m1 << endl;//输出:m1 = []
    
    Mat m2(Size(310, 310), CV_8UC3);//指定矩阵大小、类型的构造函数
    m2 = Scalar(0, 0, 255);
    namedWindow("m2", CV_WINDOW_AUTOSIZE);
    imshow("m2", m2);
    
    Mat m3(310, 310, CV_8UC3);//指定行数、列数、类型的构造函数
    m3 = Scalar(0, 0, 0);
    namedWindow("m3", CV_WINDOW_AUTOSIZE);
    imshow("m3", m3);
    
    Mat m4(310, 310, CV_8UC3, Scalar(255, 0, 0));//指定矩阵行列、类型、向量的构造函数
    namedWindow("m4", CV_WINDOW_AUTOSIZE);
    imshow("m4", m4);
    
    Mat m5(src.size(), src.type());//创建一个和原图大小类型相同的图像
    namedWindow("m5", CV_WINDOW_AUTOSIZE);
    imshow("m5", m5);

04_Opencv之Mat对象_第1张图片
Mat m4(310, 310, CV_8UC3, Scalar(255, 0, 0));其前两个参数分别表示行跟列的数目,第三个参数CV_8UC3中的8表示每个通道占8位,U表示无符号,C表示char类型,3表示通道数目,第四个参数是向量表示初始化每个像素值是多少,向量长度与通道数目一致,如果是3通道,向量中的值依次是blue,green,red颜色空间的值

三.Mat常用方法

void copyTo(Mat mat);//完全复制一份
void convertTo(Mat dst, int type);//转换,比如8位的转换为float
Mat clone();//完全复制一份
int channels();//通道数
int depth();//深度
bool empty();//是否空
uchar* ptr(i = 0);//矩阵数据指针

三.Mat对象创建

  • 通过构造函数创建

    Mat m4(310, 310, CV_8UC3, Scalar(255, 0, 0));
    
  • 通过create函数创建

    Mat m6;
    m6.create(310, 310, CV_8UC2);
    m6 = Scalar(127, 127);
    
  • 定义小数组

    Mat m7 = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    

四.Mat对象复制

  • 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分

    Mat m8(src);
    
  • 完全复制:如果想把Mat对象的头部和数据部分一起复制,可通过如下两种方式实现:

    Mat m9 = src.clone();
    Mat m9;
    src.copyTo(m9);
    

你可能感兴趣的:(Opencv)