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 );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM