正確的方式
前面介紹的一些讀取和寫入矩陣資料的方式,實際上,你可能很少會使用它們。因為,在大多數情況下,你需要使用最有效率的方式來訪問矩陣中的資料。如果使用以上的函式介面來訪問資料,效率比較低,你應該使用指標方式來直接訪問矩陣中資料。特別是,如果你想遍歷矩陣中所有元素時,就更需要這樣做了。
在用指標直接訪問矩陣元素時,就需要格外注意矩陣結構體中的step成員。該成員是以位元組為單位的每行的長度。而矩陣結構體的cols或width就不適合此時使用,因為為了訪問效率,矩陣中的記憶體分配上,是以每四個位元組做為最小單位的。因此如果乙個矩陣的寬度是三個位元組,那麼就會在寬度上分配四個位元組,而
此時每行最後乙個位元組會被忽略掉。所以我們用step則會準確地按行訪問資料。
我們可以通過以下例子,看一下rows,cols,height,width,step的資料,你可以通過改變矩陣的元素型別定義,來檢視step的改變:
#pragma comment(lib,"cxcore.lib")
#include"cv.h"
#include
void main()
如果我們的矩陣儲存的是浮點型(或整數型別)資料,此時矩陣中每個元素佔4位元組,則如果我們用float型別指標指向下一行時,我們實際上要用float型別指標挪動step/4的長度,因為float型別指標每挪動乙個單位就是4個位元組長度。
如果我們的矩陣儲存的是double型別資料,此時矩陣中每個元素佔8位元組,則如果我們用double型別指標指向下一行時,我們實際上要用double型別指標挪動step/8的長度,因為double型別指標每挪動乙個單位就是8個位元組長度。
我們重新看一下cvmat型別的資料結構定義,其中,data就是資料部分,指向data的指標可以是多種資料型別的:
typedef struct cvmat data;//資料部分
union ;
union ;
} cvmat;
我們可以通過為矩陣賦值,和讀取的例子,檢視怎樣使用step:
#pragma comment(lib,"cxcore.lib")
#include"cv.h"
#include
void main()}
for(row = 0; row < mat->rows; row++)
printf("/n");}}
如果我們使用的指標型別為uchar*型別,則事情可能會簡單一些,不用考慮step/4,step/8等類似情況,我們推薦用這種方式。如下例所示:
#pragma comment(lib,"cxcore.lib")
#include"cv.h"
#include
void main()}
for(row = 0; row < mat->rows; row++)
printf("/n");}}
OpenCV 矩陣訪問
正確的方式 前面介紹的一些讀取和寫入矩陣資料的方式,實際上,你可能很少會使用它們。因為,在大多數情況下,你需要使用最有效率的方式來訪問矩陣中的資料。如果使用以上的函式介面來訪問資料,效率比較低,你應該使用指標方式來直接訪問矩陣中資料。特別是,如果你想遍歷矩陣中所有元素時,就更需要這樣做了。在用指標直...
OpenCV 矩陣資料訪問方法
cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在 學習opencv 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主要講解...
OpenCv矩陣元素的訪問技巧
本文 cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在 學習opencv 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主...