Learning OpenCV(0)——關於cvPtr*D系列

最近在看Learning OpenCV,剛看到第三章的Accessing Data in Your Matrix就卡住了,慚愧啊。查找了很多資料終於弄明白了。

 

首先介紹一下cvPtr*D系列函數,它們都是用來獲取CvMat矩陣中指定索引值的數據的。查了一下OpenCV安裝目錄下的手冊,居然發現所有cvPtr*D函數的返回值都是uchar*!這就奇怪了,CvMat矩陣是可以存儲多種數據結構的,怎麼可能用uchar*一個類型就代表了呢?於是接着查了一下CvMat的定義,如下:

發現它所有的數據都定義在一個union結構中。本人一直都是搞C++的,沒怎麼接觸過union結構,而OpenCV大部分是用c寫的,沒想到居然使用union,沒辦法,還是先學習下union到底是幹什麼的吧。

長話短說,經過查閱一些資料,我發現:其實union和struct很像,區別在於,union中一旦給某個成員初始化,那麼只有這一個成員是合法的,可以被外部訪問,而其他的成員就會被替換掉,成爲未定義狀態;而struct是可以給每個成員賦值而不會相互影響的。顯然,OpenCV正是利用這一機制靈活的實現了對各種數據類型的支持。

在CvMat中,data的第一個成員就是uchar* ptr,那麼,只要得到這個ptr,我們就得到了指向data的第一個字節的指針,接着只要使用強制類型轉換即可得到指向相應類型的數據指針了。下面的程序很好的演示了這一點:


同時還可以看出,對於mat3,儘管它是多通道矩陣,但仍然是一個4×1的二維矩陣,所以依然要使用cvPtr2D,但此時返回的是一個指向包含3個float類型元素的數組指針,爲了得到各個通道的元素,還要對這個數組指針進行遍歷。
其實,說了這麼多,最主要的是要對union結構有較深刻的認識,那這個問題就迎刃而解了!^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章