• CV::Mat介绍


    cv::Mat是OpenCV2和OpenCV3中基本的数据类型,在cv::Mat类中,关于cv::Mat的定义和初始化有多种不同的形式,这里,将对其进行详尽的总结和介绍。

    一、无数据拷贝的cv::Mat的定义和初始化

    1、默认形式

    cv::Mat m;
    

    2、指定类型和大小(行列)的二维数组

    cv::Mat m(int rows, int cols, int type);
    

    3、有初始化值的指定类型和大小(行列)的二维数组

    cv::Mat m(int rows, int cols, int type, const Scalar& s);
    

    4、使用预先存在数据定义的指定类型和大小(行列)的二维数组

    cv::Mat m(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
    

    5、指定大小(size)和类型的二维数组

    cv::Mat m(cv::Size sz, int type, const Scalar& s);
    

    6、使用预先存在的数据定义的指定大小(size)和类型的二维数组

    cv::Mat m(cv::Size sz, int type, void* data, size_t step = AUTO_STEP);
    

    7、指定类型的多维数组

    cv::Mat m(int ndims, const int* sizes, int type);
    

    8、有初始化值的指定类型多维数组

    cv::Mat m(int ndims, const int* sizes, int type, const Scalar& s);
    

    9、使用预先存在的数据定义的指定类型的多维数组

    cv::Mat m(int ndims, const int* sizes, int type, void* data, size_t step = AUTO_STEP);
    

    二、从其他cv::Mat进行数据拷贝的定义和初始化

    1、拷贝构造形式

    cv::Mat m(const cv::Mat& mat);
    

    2、指定行列范围的拷贝构造

    cv::Mat m(const cv::Mat& mat, const cv::Range& rows, const cv::Range& cols);
    

    3、指定ROI的拷贝构造

    cv::Mat m(const cv::Mat& mat, const cv::Rect& roi);
    

    4、使用多维数组中指定范围内的数据的拷贝构造

    cv::Mat(const cv::Mat& mat, const cv::Range* ranges);
    

    三、使用OpenCV中的模板进行定义和初始化

    1、使用cv::Vec定义相同类型、大小为n的一维数组

    cv::Mat m(const cv::Vec<T, n>& vec, bool = copyData = true);
    

    2、使用cv::Matx定义相同类型、大小为mxn的二维数组

    cv::Mat(const cv::Matx<T, m, n>& vec, bool copyData = true);
    

    3、使用STL vector定义相同类型的一维数组

    cv::Mat(const std::vector<T>& vec, bool copyData = true);
    

    四、直接使用静态函数创建cv::Mat

    1、使用zeros()函数定义指定大小和类型的cv::Mat(全为0)

    cv::Mat m = cv::Mat::zeros(int rows, int cols, int type);
    

    2、使用ones()函数定义指定大小和类型的cv::Mat(全为0)

    cv::Mat m = cv::Mat::ones(int rows, int cols, int type);
    

    3、使用eye()函数定义指定大小和类型的cv::Mat(恒等矩阵)

    cv::Mat m = cv::Mat::eye(int rows, int cols, int type);
    

    五. IplImage与CV::Mat之间的转换

    A. 将IplImage-----> Mat类型

    Mat::Mat(const IplImage* img, bool copyData=false);
    

    默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。当将参数copyData设为true后,就会复制整个图像数据。
    例:

    IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
    Matmtx(iplImg); // IplImage* ->Mat 共享数据
    // or : Mat mtx = iplImg;或者是:Mat mtx(iplImg,0); // 0是不复制影像,也就是iplImg的data共用同个记意位置,header各自有
    

    B. 将Mat类型转换-----> IplImage类型

    同样只是创建图像头,而没有复制数据。

    IplImage ipl_img = img; // Mat -> IplImage
    IplImage*-> BYTE*
    BYTE* data= img->imageData;
    

    六 CvMat 与IPlimage类图片之间的相互转化

    A.CvMat-> IplImage

    IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
    cvGetImage(matI,img);
    cvSaveImage("rice1.bmp",img);
    

    B.IplImage -> CvMat

    IplImage* img = cvLoadimage("leda.jpg",1);
    //法1:
    CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
    cvConvert( img, mat );
    //法2:
    CvMat mathdr;
    CvMat *mat = cvGetMat( img, &mathdr );
    
  • 相关阅读:
    ASP.NET结合COM组件发送Email
    木马生成技术
    AJAX中使用Session
    对象模型文档对象模型DOM简介
    何遍历数据源中的表名称
    AJAX.NET用户开发指南
    用ASP.NET上传大文件
    .net反编译利器
    Equals和GetHashcode
    Factory Method模式
  • 原文地址:https://www.cnblogs.com/guoben/p/12728390.html
Copyright © 2020-2023  润新知