opencv中常見的 與圖像操作有關的資料容器有Mat,cvMat和IplImage,這三種類型都可以代表和顯示圖像,但是,Mat類型側重于計算,數學性較 高,openCV對Mat類型的計算也進行了優化。而CvMat和IplImage類型更側重于“圖像”,opencv對其中的圖像操作(縮放、單通道提 取、圖像門檻值操作等)進行了優化。在opencv2.0之前,opencv是完全用C實作的,但是,IplImage類型與CvMat類型的關系類似于面 向對象中的繼承關系。實際上,CvMat之上還有一個更抽象的基類----CvArr,這在源代碼中會常見。
1. IplImage
opencv中的圖像資訊頭,該結構體定義:
<a></a>
dataOrder中的兩個取值:交叉存取顔色通道是顔色資料排列将會是BGRBGR...的交錯排列。分開的顔色通道是有幾個顔色通道就分幾個顔色平面存儲。roi是IplROI結構體,該結構體包含了xOffset,yOffset,height,width,coi成員變量,其中xOffset,yOffset是x,y坐标,coi代表channel of interest(感興趣的通道),非0的時候才有效。通路圖像中的資料元素,分間接存儲和直接存儲,當圖像元素為浮點型時,(uchar *) 改為 (float *):
View Code
始化使用IplImage *,是一個指向結構體IplImage的指針:
2.CvMat
首先,我們需要知道,第一,在OpenCV中沒有向量(vector)結構。任何時候需要向量,都隻需要一個列矩陣(如果需要一個轉置或者共轭向量,則需要一個行矩陣)。第二,OpenCV矩陣的概念與我們線上性代數課上學習的概念相比,更抽象,尤其是矩陣的元素,并非隻能取簡單的數值類型,可以是多通道的值。CvMat 的結構:
建立CvMat資料:
對矩陣資料進行通路:
複制矩陣操作:
<a href="http://www.cnblogs.com/arxive/p/5257134.html#">+ View Code</a>
3.Mat
Mat是opencv2.0推出的處理圖像的新的資料結構,現在越來越有趨勢取代之前的cvMat和lplImage,相比之下Mat最大的好處就是能夠更加友善的進行記憶體管理,不再需要程式員手動管理記憶體的釋放。opencv2.3中提到Mat是一個多元的密集資料數組,可以用來處理向量和矩陣、圖像、直方圖等等常見的多元資料。
從以上結構體可以看出Mat也是一個矩陣頭,預設不配置設定記憶體,隻是指向一塊記憶體(注意讀寫保護)。初始化使用create函數或者Mat構造函數,以下整理自opencv2.3.1 Manual:
通路Mat的資料元素:
Mat可進行Matlab風格的矩陣操作,如初始化的時候可以用initializers,zeros(), ones(), eye(). 除以上内容之外,Mat還有有3個重要的方法:
4. CvMat, Mat, IplImage之間的互相轉換
沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。
本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/arxive/p/5257134.html,如需轉載請自行聯系原作者