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

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章