三、Mat類的使用

1.Mat的使用

Mat是一類,由兩個數據部分組成:矩陣頭(包含矩陣尺寸,存儲方法,存儲地址等)和一個存儲所有像素值的矩陣(可以是不同維度的矩陣)。
一個圖片存儲了所有像素值,所以,不應該進行大圖片的複製。
opencv有個機制,針對同一張圖像,讓每個Mat有不同的矩陣頭,但是有相同的像素矩陣,及共享一個矩陣。這樣的做法,也會導致改變了矩陣,那麼其他Mat對象的矩陣也會變化。

Mat a,b,c;
a = imread("1.jpg");
Mat b(a);//使用複製構造
c = a;

這樣a,b,c的矩陣是同一個,只是矩陣頭不一樣。
實際上,a,b,c三個對象不同點在,銅鼓不同的方式訪問同一塊矩陣而已。

想使用不同的矩陣,也就是想真正的進行復制,而不是使用同一個矩陣,可使用下面的方法。

Mat a,b,c;
a = imread("1.jpg");
a.copyTo(b);//將a複製給b
c = a.clone();//a的clone返給c

這樣的方式使得,a,b,c有不同的矩陣,修改其中任何一個對象的矩陣,都不會影響其他的矩陣。

2.像素值的存儲方式

像素值的存儲需要指定,顏色空間和數據類型。

2.1顏色空間

顏色空間:給定一個顏色,如何組合顏色元素以及其編碼。最簡單的顏色空間是灰度級空間,它只有黑色和白色,隨它們進行組合便可以產生不同程度的顏色。
一般的顏色空間都是3元素或4原色。
RGB就是三原素,紅色,綠色,藍色。另一種顏色便是透明色A(alpha)。
HSV顏色空間:色調(H),飽和度(S),明度(V)
HLS顏色空間:色調(H),飽和度(S),亮度(L)
等等,還有很多顏色空間,用到的再說。
每個組成元素都有自己的尺寸,比如RGB,其中一個元素R可以是8位,16位,32位等,也可以是對應的有符號和無符號。
不同的元素從尺寸會導致圖像所佔的空間大小

2.2Mat的顯示創建

//下面創建了一個2*2的2維度矩陣,其中每個點是有3通道的元素值組成
//每個元素是8位無符號,每個點對應的3各元素值初始值位0,0,255
Mat a(2,2,CV_8UC3,Scalar(0,0,255));

//下面創建了一個3*3*5的3維度矩陣,其中每個點是有3通道的元素值組成
//每個元素是8位無符號,每個點對應的3各元素值初始值均爲0
int m[2] = {3,5};
Mat b(3,m,CV_8UC3,Scalsr::all(0));

定義符號說明
CV_[位數][帶符號與否][類型前綴]C[通道數。
隨機初始化Mat矩陣的值

Mat  a(2,2,CV_8UC3);
//元素初始化爲0-255隨機值
randu(a , Scalar::all(0),Scalar::all(255));

Mat初始化還有很多方法,這裏不再多說。

發佈了63 篇原創文章 · 獲贊 19 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章