opencv在android平臺下的開發【2】-圖像容器 Mat

圖像在計算機中就是一堆點的數值,按順序存儲構成矩陣,opencv提供了一個 Mat 類來管理圖像矩陣。html

Mat類由兩部分組成:java

  • 矩陣頭:包含矩陣尺寸,存儲方法,存儲地址等信息。
  • 圖像矩陣指針:指向存儲全部像素值的矩陣的指針。

爲何不直接在Mat中直接存儲圖像矩陣?算法

由於opencv處理對象時圖片和視頻,數據量都比較大,因此opencv採起的方法時,只在內存中保持一份圖像矩陣,Mat類中只保持一個指向該內存的指針,達到圖像矩陣共享的目的,節省存儲資源的消耗。性能

另外,在作處理時不少方法牽涉到Mat對象複製操做,,對圖像矩陣的操做都是比較重量級的,若是Mat對象中持有圖像矩陣,那複製操做處理的數據就會很大,耗時很長,影響算法性能。採用持有矩陣頭+圖像矩陣指針的方式,在複製時,只須要複製矩陣頭和指針便可,效率很高。編碼

須要注意的時,多個Mat對象指向同一個圖像矩陣時,某個Mat對象對圖像矩陣的操做也會影響其餘Mat對象。spa

圖像矩陣何時被釋放?指針

opencv採用引用計數的方式管理圖像矩陣的釋放,即每當新的Mat對象指向圖像矩陣時,矩陣的計數器就會增長,Mat對象再也不指向該矩陣時,矩陣的計數器就減小,當計數器達到零時,矩陣就會被釋放。code

如何存儲圖像像素值視頻

如何存儲圖像像素值涉及兩個方面:顏色空間、使用的數據類型。htm

  • 顏色空間:對一個給定的顏色,如何組合顏色元素以對該顏色進行編碼。
    • 灰度空間:最簡單的顏色空間,只處理黑色和白色,對它們進行組合能夠產生不一樣程度的灰色;
    • 彩色圖像顏色空間:把顏色分紅三個或者四個基元素,經過組合基元素能夠產生全部的顏色。
      • RGB:是最經常使用的一種顏色空間,基色是紅色、綠色和藍色,有時爲了表示透明顏色也會加入第四個元素 alpha (A)。
      • HSV和HLS:把顏色分解成色調、飽和度和亮度/明度。這是描述顏色更天然的方式,好比能夠經過拋棄最後一個元素,使算法對輸入圖像的光照條件不敏感。
      • YCrCb:JPEG圖像格式中普遍使用。
      • CIE Lab*是一種在感知上均勻的顏色空間,它適合用來度量兩個顏色之間的距離。
  • 數據類型:顏色元素的數據類型,決定控制顏色顯示的精度。最小的數據類型是 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建立方法,這裏再也不贅述,請參考官方文檔

相關文章
相關標籤/搜索