我記得開始接觸OpenCV就是由於一個算法裏面須要2維動態數組,那時候看core這部分也算是蜻蜓點水吧,隨着使用的增多,對Mat這個結構愈來愈喜好,也以爲有必要溫故而知新,因而此次再看看Mat。算法
Mat最大的優點跟STL很類似,都是對內存進行動態的管理,不須要以前用戶手動的管理內存,對於一些大型的開發,有時候投入的lpImage內存管理的時間甚至比關注算法實現的時間還要多,這顯然是不合適的。除了有些嵌入式場合必須使用c語言,我任什麼時候候都強烈像你們推薦Mat。數組
Mat這個類有兩部分數據。一個是matrix header,這部分的大小是固定的,包含矩陣的大小,存儲的方式,矩陣存儲的地址等等。另外一個部分是一個指向矩陣包含像素值的指針。數據結構
若是想創建互不影響的Mat,是真正的複製操做,須要使用函數clone()或者copyTo()。ide
說到數據的存儲,這一直就是一個值得關注的問題,Mat_<uchar>對應的是CV_8U,Mat_<uchar>對應的是CV_8U,Mat_<char>對應的是CV_8S,Mat_<int>對應的是CV_32S,Mat_<float>對應的是CV_32F,Mat_<double>對應的是CV_64F,對應的數據深度以下:函數
• CV_8U - 8-bit unsigned integers ( 0..255 )this
• CV_8S - 8-bit signed integers ( -128..127 )spa
• CV_16U - 16-bit unsigned integers ( 0..65535 ).net
• CV_16S - 16-bit signed integers ( -32768..32767 )指針
• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )blog
• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
這裏還須要注意一個問題,不少OpenCV的函數支持的數據深度只有8位和32位的,因此要少使用CV_64F,可是vs的編譯器又會把float數據自動變成double型,有些不太爽。
還有個須要注意的問題,就是流操做符<<對於Mat的操做,僅限於Mat是2維的狀況。
還有必要說一下Mat的存儲是逐行的存儲的。
再說說Mat的建立,方式有兩種,羅列一下:1.調用create(行,列,類型)2.Mat(行,列,類型(值))。例如:
還有一種快速初始化數據的辦法,以下:
若是你須要提早釋放數據的指針和內存,能夠調用release()。
對於數據的獲取,固然仍是調用at<float>(3, 3)這樣的格式爲最佳。其餘的方法我甚少嘗試,就不敢介紹了。
最後要提的一點是關於Mat的表達式,這個也很是多,加減乘除,轉置求逆,我怎麼記得我之前介紹過呢。那就很少說啦~