這一篇文章中主要介紹有關Mat類的使用,主要包括:
- 通過構造函數定義Mat對象;
- Mat對象常用屬性以及方法
- 創建一個空白圖像並進行賦值
- 創建一個小數組
通過構造函數定義Mat對象
Mat
中提供了很多的構造函數,這里使用兩種方式:
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
第一種方式的示例如下:
// 1. 通過構造函數定義Mat對象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 創建Mat對象
dst = Scalar(127, 0, 255); // 填充值
// 顯示圖像
namedWindow("dst image", WINDOW_AUTOSIZE);
imshow("dst image", dst);
waitKey(0);
結果如下圖所示:
當然,其中構造函數的兩個參數也可以來自已有Mat
對象,如:
Mat dst = Mat(src.size(), src.type());
第二種使用構造函數定義Mat對象的示例如下:
// 2. 通過構造函數定義Mat對象
Mat dst = Mat(128, 128, CV_8UC3, Scalar(0, 0, 255));
Mat對象常用屬性以及方法
- 展示以下Mat對象常用的屬性:
// 1. 通過構造函數定義Mat對象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 創建Mat對象
dst = Scalar(127, 0, 255); // 填充值
// 3. Mat對象常用屬性
int rows = dst.rows; // 獲取矩陣行
int cols = dst.cols; // 獲取矩陣列
int dims = dst.dims; // 獲取矩陣維度
printf("rows: %d, cols: %d, dims: %d\n", rows, cols, dims);
輸出:
rows: 128, cols: 128, dims: 2
需要注意的是,OpenCV中維度dims
與通道channels
是兩個不同概念:
-
維度
dims
表示矩陣的維度,如上面示例是\(128\times 128\)大小的矩陣,它的維度是2; -
通過
channels
表示矩陣中每個元素有幾個值,這個示例是3個值,通道數為3;ix
- 演示一些Mat對象常用的方法:
// 4. Mat對象常用方法
int channels = dst.channels(); // 獲取矩陣元素通道數
int depth = dst.depth(); // 獲取每個像素的深度,0: CV_8U, 1: CV_8S,...
bool isEmpty = dst.empty();
printf("channels: %d, depth: %d, isEmpty: %d \n", channels, depth, isEmpty);
輸出:
channels: 3, depth: 0, isEmpty: 0
- 演示一下如何復制Mat對象
分成兩種情況,一種是對原始對象多了一個tmp暫存對象,原始對象改變,tmp對象也改變;另一種是完全構造一個新Mat對象;
第一種,有兩種方式,分別是:使用賦值運算符和使用Mat類復制構造函數;
// 5. 復制Mat對象
// 5.1. tmp對象與原始對象綁定
Mat tmp = src; // 通過賦值運算符
Mat tmp2(src); // 通過復制構造函數
第二種,通過Mat::clone()
與copyTo()
方法:獲得一個全新的Mat對象;
// 5.2 獲得一個新的Mat對象
Mat dst1 = src.clone();
Mat dst2;
src.copyTo(dst2);
.prt
訪問矩陣元素
獲取圖像第一行的第一個元素:
// 6. prt的使用
const uchar * firstRowElement = src.ptr<uchar>(0);
printf("First Row Element: %d\n", *firstRowElement);
- 其他方法
// 7. 其他方法
Mat dstOther1 = Mat::zeros(src.size(), src.type()); // 創建全1矩陣
Mat dstOther2 = Mat::ones(src.size(), src.type()); // 創建零矩陣
Mat dstOther3 = Mat::eye(src.size(), src.type()); // 創建單位矩陣
Mat dstOther4 = Mat:: zeros(2, 2, CV_8UC1);
創建一個空白圖像並進行賦值
- 創建一個空白圖像,並進行賦值, 方法如下:
// 8. 創建空白圖像並進行賦值
Mat emptyImage; // 創建Mat對象
emptyImage.create(src.size(), src.type());
emptyImage = Scalar(0, 0, 255);
-
創建多維數組
// 9. 創建多維數組 int sz[3] = {3, 2, 2}; // 三維矩陣,3x2x2 Mat dstMultiMat(3, sz, CV_8UC1, Scalar::all(0));
表示創建一個三維(\(3\times 2\times 2\))的矩陣,通道數為1,並全部以0填充;
創建小數組
用於創建一些kernel,用於圖像的掩模計算:
// 10. 創建小數組
Mat smallMat = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << smallMat << endl;
輸出:
[0, -1, 0;
-1, 5, -1;
0, -1, 0]