1. 程式人生 > >opencv3程式設計入門學習筆記1-----基本影象容器Mat

opencv3程式設計入門學習筆記1-----基本影象容器Mat

1、Mat的結構

Mat本質上是由兩個資料部分組成: (包含資訊有矩陣的大小用於儲存的方法矩陣儲存的地址等)的矩陣頭一個指標指向包含了畫素值的矩陣(可根據選擇用於儲存的方法採用任何維度儲存資料)。矩陣頭部的大小是恆定的。然而,矩陣本身的大小因影象的不同而不同,通常是較大的數量級。因此,當你在您的程式中傳遞影象並在有些時候建立影象副本您需要花費很大的代價生成影象矩陣本身,而不是影象的頭部。OpenCV 是影象處理庫,它包含大量的影象處理函式。若要解決的計算挑戰,最終大部分時間你會使用庫中的多個函式。由於這一原因影象傳給庫中的函式是一種常見的做法。我們不應忘記我們正在談論往往是計算量相當大的影象處理演算法。我們想要做的最後一件事是通過製作不必要的可能很大的影象的拷貝進一步降低您的程式的速度。


2、建立Mat物件的方法

(1)Mat M (2,2,CV_8UC3,Scalar(0,0,255)

在Mat類中我們可以找到以下函式相關定義,也就是用指定的值填充二維矩陣,這裡第一個引數是rows是矩陣的行數,第二個引數cols是矩陣的列數,也就是2*2的矩陣,而型別是CV_(位數)+(資料型別)+(通道數),CV_8UC3表明使用8位的unsigned char 型,每個畫素由三個元素組成三通道。

//! constucts 2D matrix and fills it with the specified value _s.
    Mat(int rows, int cols, int type, const Scalar& s);

(2)const Scalar& s引數

這裡const代表是一個常數,不能被改變。Scalar是一個類,代表的是顏色,Scalar(a,b,c)定義 的RGB顏色值:紅色分量為c,綠色分量為b,藍色分量為a.Scalar& s中s是Scalar類的指標變數。

3、建立帶Alpha通道的Mat

(1)什麼是Alpha通道

阿爾法通道(Alpha Channel)是指一張圖片的透明和半透明度。例如:一個使用16位儲存的圖片,可能5位表示紅色,5位表示綠色,5位表示藍色,1位是阿爾法。在這種情況下,它要麼表示透明要麼不是。一個使用32位儲存的圖片,每8位表示紅綠藍,和阿爾法通道。在這種情況下,就不光可以表示透明還是不透明,阿爾法通道還可以表示256級的半透明度。 (2)建立帶Alpha通道的Mat的
函式 createAlphaMat(mat)
也就是建立4通道(RGB+透明度),其中UCHAR_MAX的巨集定義為0xff,對應的是R通道,對於G通道,((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX)表示越往右佔的百分比就越少,顏色也就越深,同理,對於B通道,((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX)表示越往下佔的百分比就越少,顏色也就越深。最後的透明度,取值為(0.5 * (rgba[1] + rgba[2])也就是取G和B通道的平均值。 void createAlphaMat(Mat &mat)
{
for(int i = 0; i < mat.rows; ++i) {
for(int j = 0; j < mat.cols; ++j) {
Vec4b&rgba = mat.at<Vec4b>(i, j);
rgba[0]= UCHAR_MAX;
rgba[1]= saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) *UCHAR_MAX);
rgba[2]= saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) *UCHAR_MAX);
rgba[3]= saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}