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