Mat不僅是非常有用的圖像容器類,也是一個通用的矩陣類
創建Mat對象可有以下方法:
方法一:使用Mat()構造函數
例子如下:
Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
在Mat類定義中該構造函數的原型為:
Mat(int rows, int cols, int type,const Scalar& s);
對於二維多通道圖像,要定義其尺寸,即為行數和列數,對於前兩個參數rows和cols。第三個參數是指定存儲元素的數據類型以及每個矩陣點的通道數,如下:
CV_ [The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
CV_ [位數][帶符號與否]C[通道數]
比如CV_8UC3,表示使用8位的unsigned char型,每個像素由三個元素組成三通道。
Salar是個short型的向量,能使用指定的定製化值來初始化矩陣,還可以用來表示顏色等。
方法二:在C/C++中通過構造函數
例子如下:
int size[3]={2, 2, 2};
Mat L(3, size, CV_8UC, Scalar::all(0));
創建了一個超過二維的矩陣,第一個參數指定了維數,然後傳遞一個指向一個數組的指針,這個數組中指定了每個維度的尺寸。後面兩個參數和方法一中一樣。
方法三:利用Create函數
該方法是利用Mat類中的Create()成員函數進行Mat類的初始化操作,例子如下:
Mat M;
M.create(4, 4, CV_8UC(2));
但使用此創建方法不能為矩陣設初值,只能在改變尺寸時重新為矩陣數據開闢內存而已。
方法四:對小矩陣使用逗號分隔式初始化函數
例子如下:
Mat C= (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
輸出結果為3*3矩陣。
方法五:為已存在的對象創建新信息頭
該方法使用了成員函數clone()或者copyTo()為一個已經存在的Mat對象創建一個新的信息頭,例子如下:
Mat RowClone=imageC.row(1).clone(); //把imageC的第二行復制給了RowClone
當然還有其他方法,有待日後總結。