1. 程式人生 > >openCV(1)-Mat初始化

openCV(1)-Mat初始化

這次來記一下自己對Mat類的理解,供交流

  • 首先,使用Mat就不需要為其手動分配記憶體大小,最後也不需要手動釋放它。但是我們在使用openCV函式的時候,還是要手動分配其輸入資料。
  • 第二點,Mat本質是由兩部分資料組成的類,矩陣頭(header)和指標Pointer,矩陣頭主要是包含矩陣的大小,儲存方式,儲存地址等資訊,指標中儲存了指向儲存影象畫素值矩陣的指標。
  • 一個常用的Mat類的建構函式,但是要知道,Mat類的有很多過載的建構函式
int main()
{
    Mat M(2, 2, CV_8UC3, cv::Scalar::all(1));
    //前兩個引數時指矩陣的行數和列數,
//第3個引數時重點,表示矩陣的資料型別,接下來會詳細講解 //第4個是對每個畫素值賦初值,這個程式碼就是把每個通道的畫素值都 //都賦值1.,如果是Scalsr(255,0,0),就是將255,0,0分別賦予每個畫素點的3個通道。 cout << "M=" << endl << M << endl; system("pause"); return 0; }
  • 陣列的資料型別說明
    陣列的資料型別定義了為陣列的每個元素(圖片中的畫素)通道數和每個通道上表示畫素值得位元數(位數)。任何陣列的元素都應該有下面資料型別的一種:
    單通道陣列
    CV_8U:

    CV_8U (8 bit 無符號整數)
    CV_8S (8 bit 有符號整數)
    CV_16U(16 bit 無符號整數)
    CV_16S (16 bit 有符號整數)
    CV_32S (32 bit 有符號整數)
    CV_32F (32 bit 浮點數)
    CV_64F (64 bit 浮點數)
    舉例來說:下圖展示了一個使用8 bit無符號整數的單通道陣列。因為資料型別是8 bit無符號整數,因此這個陣列的每個元素為0-255的值
    對應儲存圖為
    這裡寫圖片描述

    多通道陣列(最大支援512個通道)

    CV_8UC1 (單通道陣列,8 bit 無符號整數)
    CV_8UC2 (2通道陣列,8 bit 無符號整數)
    CV_8UC3 (3通道陣列,8 bit 無符號整數)
    CV_8UC4 (4通道陣列,8 bit 無符號整數)
    CV_8UC(n) (n通道陣列,8 bit 無符號整數 (n 可以從 1 到 512) )
    下圖展示了一個使用8 bit 無符號整數的3通道陣列。因為資料型別是8 bit無符號整數,因此這個陣列的每個元素為0-255的值。由於是3通道陣列,所以陣列由帶有3個元素的元組組成,第一個元組是{54, 0, 34},第二個元組是 {58, 78, 185} ,以此類推。

這裡寫圖片描述

對上面的資料型別使用舉例
Mat image(3,5,CV_32F);
Mat image(3,5CV_64FC(5));
Mat image(Size(100,200),CV16UC2);

-還可能會遇到這個表達,IPlImage*,這個表示式C語言操作OPENCV的資料結構,地位相當於Mat。
Mat(const IplImage* img, bool copyData=false);
可以很好的將IplImage*轉換為Mat
還有一種定義也可以轉換

IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat
  • 還要注意Mat類使用了引用技術機理,簡單講,就是在拷貝Mat類的物件的時候,只是將矩陣頭和指標複製,而複製後兩個物件指標還是指向同一塊矩陣資料區。如果要將資料矩陣也複製,必須使用copyTo()或者clone()函式。
    可以用下圖來幫助理解
    這裡寫圖片描述
Mat A,C;
A=imread("1.jpg",type);
Mat B(A);//拷貝建構函式
C=A;//直接是賦值運算

程式碼中的所有Mat物件最終都指向同一個也是唯一一個數據矩陣。雖然它們的資訊頭不同,但通過任何一個物件所做的改變也會影響其它物件。實際上,不同的物件只是訪問相同資料的不同途徑而已。
如果要將資料區一起賦值,就要這樣,如下

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

現在改變 F 或者 G 就不會影響 Mat 資訊頭所指向的矩陣。 所以說Mat 不但是一個很讚的影象容器類,它同時也是一個通用的矩陣類,所以可以用來建立和操作多維矩陣。
以上就是我看了資料寫的一些Mat類用法,供交流!