圖像在計算機中就是一堆點的數值,按順序存儲構成矩陣,opencv提供了一個 Mat 類來管理圖像矩陣。html
Mat類由兩部分組成:java
爲何不直接在Mat中直接存儲圖像矩陣?算法
由於opencv處理對象時圖片和視頻,數據量都比較大,因此opencv採起的方法時,只在內存中保持一份圖像矩陣,Mat類中只保持一個指向該內存的指針,達到圖像矩陣共享的目的,節省存儲資源的消耗。性能
另外,在作處理時不少方法牽涉到Mat對象複製操做,,對圖像矩陣的操做都是比較重量級的,若是Mat對象中持有圖像矩陣,那複製操做處理的數據就會很大,耗時很長,影響算法性能。採用持有矩陣頭+圖像矩陣指針的方式,在複製時,只須要複製矩陣頭和指針便可,效率很高。編碼
須要注意的時,多個Mat對象指向同一個圖像矩陣時,某個Mat對象對圖像矩陣的操做也會影響其餘Mat對象。spa
圖像矩陣何時被釋放?指針
opencv採用引用計數的方式管理圖像矩陣的釋放,即每當新的Mat對象指向圖像矩陣時,矩陣的計數器就會增長,Mat對象再也不指向該矩陣時,矩陣的計數器就減小,當計數器達到零時,矩陣就會被釋放。code
如何存儲圖像像素值視頻
如何存儲圖像像素值涉及兩個方面:顏色空間、使用的數據類型。htm
Mat對象建立
opencv提供了不少Mat對象的建立方法,能夠控制圖像矩陣的維度、存儲元素的數據類型和通道數、初始值。
//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建立方法,這裏再也不贅述,請參考官方文檔