1. 程式人生 > >[OpenCV3程式設計入門讀書筆記]基礎影象容器Mat(2)

[OpenCV3程式設計入門讀書筆記]基礎影象容器Mat(2)

Mat是一個類,由兩個資料部分組成,分別是矩陣頭和一個指向儲存矩陣所有畫素值的矩陣,其中矩陣頭包含了矩陣尺寸,儲存方法,儲存地址等資訊。

 

對於OpenCV1.X時代基於C語言構建的影象儲存格式IplImage*,如果在退出之前忘記release就會造成記憶體洩漏。而在OpenCV2.0之後的版本,使用了Mat結構取而代之,OpenCV變得像MATLAB那樣上手很方面。

關於Mat類:

(1)不必手動開闢空間

(2)不必在不再需要的時候立即釋放掉

 

賦值運算子和拷貝建構函式只複製資訊頭,不是深拷貝。

Mat A ,C; //僅建立資訊頭部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR); //這裡為矩陣開闢記憶體
Mat B(A); //使用拷貝建構函式
C = A; //賦值運算子

使用函式clone()或者copyTo()可以深拷貝。

Mat F = A.clone();
Mat G;
A.copyTo(G);

建立一個感興趣區域只要建立包含邊界資訊的資訊頭。

Mat D(A,Rect(10,10,100,100));//使用矩形界定
Mat E = A(Range:all(),Range(1,3)); //使用行和列界定

建立Mat物件的七種方式:

  1. 使用Mat()建構函式
    Mat M(2,2,CV_8UC3,Scalar(0,0,255));

     

  2. 在C/C++中通過建構函式進行初始化
    int sz[3] = {2,2,2};
    Mat L(3,sz,CV_8UC3,Scalar::all(0));

    上面的例子展示瞭如何建立一個超過二維的矩陣,第二引數傳遞了一個指向陣列的指標,這個陣列包含了每個維度的尺寸。

  3. 為已存在的IplImage指標建立資訊頭 
  4. 利用Create()函式
    M.Create(4,4,,CV_8UC(2));

     

  5. 採用Matlab的初始化方式:包括zeros(),ones(),eyes()。
    Mat E = Mat::eye(4,4,CV_64F); //單位矩陣
    Mat E = Mat::ones(4,4,CV_64F); 
    Mat E = Mat::zeros(4,4,CV_64F);
    

     

  6. 對小矩陣使用逗號分隔式初始化函式
    Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    

     

  7. 為已存在的物件建立新的資訊頭
    Mat RowClone = C.row(1).clone();