opencv-android-影象容器 Mat
影象在計算機中就是一堆點的數值,按順序儲存構成矩陣,opencv提供了一個 Mat 類來管理影象矩陣。
Mat類由兩部分組成:
- 矩陣頭:包含矩陣尺寸,儲存方法,儲存地址等資訊。
- 影象矩陣指標:指向儲存所有畫素值的矩陣的指標。
為什麼不直接在Mat中直接儲存影象矩陣?
因為opencv處理物件時圖片和視訊,資料量都比較大,所以opencv採取的方法時,只在記憶體中保持一份影象矩陣,Mat類中只保持一個指向該記憶體的指標,達到影象矩陣共享的目的,節省儲存資源的消耗。
另外,在做處理時很多方法牽涉到Mat物件複製操作,,對影象矩陣的操作都是比較重量級的,如果Mat物件中持有影象矩陣,那複製操作處理的資料就會很大,耗時很長,影響演算法效能。採用持有矩陣頭+影象矩陣指標的方式,在複製時,只需要複製矩陣頭和指標即可,效率很高。
需要注意的時,多個Mat物件指向同一個影象矩陣時,某個Mat物件對影象矩陣的操作也會影響其他Mat物件。
影象矩陣什麼時候被釋放?
opencv採用引用計數的方式管理影象矩陣的釋放,即每當新的Mat物件指向影象矩陣時,矩陣的計數器就會增加,Mat物件不再指向該矩陣時,矩陣的計數器就減少,當計數器達到零時,矩陣就會被釋放。
如何儲存影象畫素值
如何儲存影象畫素值涉及兩個方面:顏色空間、使用的資料型別。
-
顏色空間:對一個給定的顏色,如何組合顏色元素以對該顏色進行編碼。
- 灰度空間:最簡單的顏色空間,只處理黑色和白色,對它們進行組合可以產生不同程度的灰色;
-
彩色影象顏色空間:把顏色分成三個或者四個基元素,通過組合基元素可以產生所有的顏色。
- RGB:是最常用的一種顏色空間,基色是紅色、綠色和藍色,有時為了表示透明顏色也會加入第四個元素 alpha (A)。
- HSV和HLS:把顏色分解成色調、飽和度和亮度/明度。這是描述顏色更自然的方式,比如可以通過拋棄最後一個元素,使演算法對輸入影象的光照條件不敏感。
- YCrCb:JPEG影象格式中廣泛使用。
- CIE La b*是一種在感知上均勻的顏色空間,它適合用來度量兩個顏色之間的距離。
- 資料型別:顏色元素的資料型別,決定控制顏色顯示的精度。最小的資料型別是 char ,佔一個位元組或者8位,可以是有符號型(0到255之間)或無符號型(-127到+127之間)。儘管使用三個 char 型元素已經可以表示1600萬種可能的顏色(使用RGB顏色空間),但若使用float(4位元組,32位)或double(8位元組,64位)則能給出更加精細的顏色分辨能力。但同時也要切記增加元素的尺寸也會增加了影象所佔的記憶體空間。
Mat物件建立
opencv提供了很多Mat物件的建立方法,可以控制影象矩陣的維度、儲存元素的資料型別和通道數、初始值。
- 維度:二維時直接傳入行列數;多維時,傳入維度數、個維度尺寸組成的資料。
- 資料型別:CV_(每個專案的位數)(有符號或無符號)(型別字首)(通道數)。
- 初始值:初始元素值結構體,用來指定元素每個通道的值。
//4行 3列 8位無符號Char型 3通道 元素通道預設值為(0,0,255) Mat mat = new Mat(4, 3, CvType.CV_8UC3, new Scalar(0, 0, 255));
注意:opencv的java sdk裡面好像不支援建立多維(大於2維)Mat,所以有相關需求的還是採用jni的方式直接呼叫opencv的C/C++方法。
其他還有很多靈活方便的Mat建立方法,這裡不再贅述,請參考官方文件