Mat 介紹
? ? ? Mat的本質(zhì)是具有兩個數(shù)據(jù)部分的類:矩陣頭(包含諸如矩陣大小瘟判,用于存儲的方法禀梳,用于存儲矩陣的地址等信息)以及指向真正圖像數(shù)據(jù)矩陣的指針浓冒。矩陣頭的大小是恒定的衙吩,但真正的圖像矩陣的大小是因?qū)嶋H圖像的大小而異笔刹。
? ? ? ? opencv是圖像處理庫芥备,包含有大量的圖像處理功能。這些功能在程序中表現(xiàn)為一個一個函數(shù)的形式舌菜,那么為了處理圖像萌壳,一定少不了在函數(shù)間傳遞圖像。如果每傳遞一次圖像就為其新分配一次內(nèi)存空間日月,必然會導(dǎo)致圖像處理速度的大大下降袱瓮,同時也會占用過高的內(nèi)存空間。為了解決這個問題爱咬,opencv是這樣做的:每個Mat對象都有其唯一的矩陣頭尺借,但是實質(zhì)性的圖像矩陣地址可以共享,訪問方式可以通過指針精拟。在這種機制下燎斩,在程序中如果需要傳遞圖像時,僅傳遞圖像的矩陣頭信息和指針蜂绎,而不會去傳遞實質(zhì)性的圖像數(shù)據(jù)栅表。
? 例子1: Mat A, C;// creates just the header parts
? ? ? ? ? ? ? ? A =imread(argv[1],IMREAD_COLOR);// here we'll know the method used (allocate matrix)
? ? ? ? ? ? ? ? Mat B(A);// Use the copy constructor
? ? ? ? ? ? ? ? C = A;// Assignment operator
? ? ? ? 例子1中,3個Mat對象 A,B,C所指向的實質(zhì)性的圖像數(shù)據(jù)矩陣是同一個师枣,但是它們的矩陣頭信息(身份證號)是不同的怪瓶。由于實質(zhì)性的圖像數(shù)據(jù)矩陣是同一個,所以改變A,B,C中的任何一個坛吁,另外兩個也會改變劳殖。這種改變表現(xiàn)在它們的矩陣頭信息的變化上铐尚。例如,通過對A操作把圖像大小減小了一半哆姻,那么B,C的矩陣頭信息中表征圖像大小的信息部分一定也會變宣增。在這種機制基礎(chǔ)之上會有一個有意思的事情發(fā)生,你完全可以創(chuàng)建一個只引用實質(zhì)圖像矩陣的子部分信息的矩陣頭矛缨。這種應(yīng)用有一個很好的例子爹脾,它是:ROI,只需創(chuàng)建具有新邊界的新標(biāo)題即可,如下面例子2箕昭,其中 Mat 對象D灵妨,E只引用了A所引用的圖像的一部分。
? ? 例子2:Mat D (A,Rect(10, 10, 100, 100) );// using a rectangle
? ? ? ? ? ? ? ? Mat E = A(Range::all(), Range(1,3));// using row and column boundaries
? ? ? ? ? ? 圖像在內(nèi)存中的整個生命周期中會有一個計數(shù)變量與其相關(guān)落竹,這個變量有什么用呢泌霍?它用來表征,有多少個Mat 對象述召,引用這個圖像朱转,當(dāng)這個計數(shù)變量值為0時,系統(tǒng)會釋放掉圖像 所占內(nèi)存积暖。當(dāng)然有時也許要真正完全傳遞整個圖像而不是指針藤为,因此opencv提供了cv :: Mat :: clone()和cv :: Mat :: copyTo()函數(shù)來解決這個問題,如下例子3夺刑。
? ? ? 例子3:Mat F = A.clone();
? ? ? ? ? ? ? ? ? ? Mat G;
? ? ? ? ? ? ? ? ? ? A.copyTo(G);
? ? ? ? ? ? 例子3中缅疟,A,F,G指針?biāo)傅膶嵸|(zhì)性圖像矩陣不是同一個,因此通過A,F,G對圖像操作遍愿,相互之間不會有影響 存淫。
存放方法
? ? ? ? 存放方法的描述是關(guān)于如何存儲像素值的(說明存放像素有多種方法可以選擇)。這種選擇错览,體現(xiàn)在色彩空間和數(shù)據(jù)類型的選擇上纫雁。色彩空間不同,也就是對顏色編碼的方式不同倾哺。最簡單的一種是灰度空間轧邪,在灰度空間下我們可以使用白色和黑色的不同組合來創(chuàng)建許多灰色陰影。
? ? ? ? 對應(yīng)顏色羞海,我們有多種編碼方式選擇忌愚,比較主流的是RGB。RGB主流的原因和我們?nèi)搜劬幋a顏色的方式有關(guān)系却邓。它的基色是
紅色硕糊,綠色和藍(lán)色。為了編碼顏色的透明度,有時會添加第4個量:alpha(A)简十。
但是還有很多其他色彩空間系統(tǒng)檬某,并且各有優(yōu)點:
? 1、? RGB是最常見的一種螟蝙,因為我們的眼睛使用的恢恼,就是類似的系統(tǒng)。但是opencv標(biāo)準(zhǔn)顯示系統(tǒng)使用BGR色彩空間(紅胰默、藍(lán)通道切換)來編碼顏色场斑。
? 2、 HSV和HLS將顏色分解為它們的色相牵署,飽和度和值/亮度分量漏隐,這是我們描述顏色更自然的方法。例如奴迅,您可以忽略最后一個變量青责,從而使算法對輸入圖像的光照條件不太敏感。
? 3半沽、 流行的JPEG圖像格式使用的YCrCb爽柒。
? ? 4吴菠、CIE L*a*b*是一個感知上統(tǒng)一的色彩空間者填,如果您需要測量給定顏色與另一種顏色空間的差距,它會派上用場做葵。
色彩空間解決的是一信號有多少通道的問題(多少變量)占哟,那么數(shù)據(jù)類型解決的是,一個變量幾位數(shù)據(jù)位(是否有符號酿矢,是整數(shù)還是實數(shù))度量它的問題榨乎。