1. 程式人生 > >《OpenCV3程式設計入門》——4.1.4 顯示建立Mat物件的七種方法

《OpenCV3程式設計入門》——4.1.4 顯示建立Mat物件的七種方法

目錄

1、使用Mat()建構函式

2、C\C++中建構函式進行初始化

3、為已經存在的IplImage指標建立資訊頭

4、利用Create()函式

5、Matlab方式的初始化

6、對小矩陣使用逗號分隔式初始化函式

7、為已經存在的物件穿件新資訊頭


Mat不但是一個非常有用的影象容器類,同時也是一個通用聚矩陣類。建立一個Mat物件有很多種方法,列舉如下:


1、使用Mat()建構函式

師範程式碼如下:

# include <opencv2/opencv.hpp>
# include <iostream>

using namespace cv;
using namespace std;

void main(){
    Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));  //Mat()建構函式建立mat類
    cout << "M= " << " " << M << endl;
}

上述程式碼執行結果為:

 對於二維多通道影象,需要制定的引數:(1)尺寸,即行數和列數,上述程式碼是:(2,2);(2)儲存元素的資料型別以及每個矩陣點的通道數,上述程式碼是:CV_8UC3(表示使用8位的unsigned char型別,每個畫素由三個元素組成三通道);(3)Scalar是個short型向量,可以用來初始化矩陣來表示顏色


2、C\C++中建構函式進行初始化

程式碼如下:

  int sz[3] = { 2, 2, 2 };
  Mat L(3, sz, CV_8UC, Scalar::all(0));

上述例子建立了一個超過兩維的矩陣,需要的引數:(1)指定維數

;(2)傳遞一個指向一個數組的指標,這裡是:sz,陣列元素代表每個維度的尺寸。(3)後續就是指定型別和初始值,和方法1相同。


3、為已經存在的IplImage指標建立資訊頭

程式碼如下:

 IplImage* img = cvLoadImage("1.jpg", 1);
 Mat mtx(img);  //轉換IplImage*->Mat

上述程式碼是將IplImage 轉換為Mat,在OpenCV3.0版本是不適用的,在3.0版本應該是:

 IplImage* img = cvLoadImage("1.jpg", 1);
 Mat mat = cvarrToMat(img);  //轉換IplImage*->Mat

4、利用Create()函式

利用Mat類中的Create()成員ha你數進行Mat類的初始化操作,此種方法不能為矩陣設定初始值,只是在改變尺寸時重新為矩陣資料開闢記憶體而已。

程式碼如下:

M.create(4, 4, CV_8UC(2));
cout << "M= " << " " << M << endl<<endl;

執行結果為:


5、Matlab方式的初始化

Matlab形式的初始化方式:zeros()、ones()、eyes()。

程式碼如下:

Mat E = Mat::eye(4, 4, CV_64F);
cout << "E= " << endl << " " << E << endl << endl;

Mat X = Mat::ones(2, 2, CV_32F);
cout << "X= " << endl << " " << X << endl << endl;
    
Mat Z = Mat::zeros(3, 3, CV_8UC1);
cout << "Z= " << endl << " " << Z << endl << endl;

執行結果為:


6、對小矩陣使用逗號分隔式初始化函式

程式碼如下:

Mat C = (Mat_<double>(3, 3)<<0,-1,0,-1,5,-1,0,-1,0);
cout << "C= " << endl << " " << C << endl << endl;


7、為已經存在的物件穿件新資訊頭

 使用clone()或者copyTo()為一個已經存在的Mat物件建立一個新的資訊頭,程式碼如下:

Mat RowClone = C.row(1).clone();
cout << "RowClone= " << endl << " " << RowClone << endl << endl;

執行結果如下: