OpenCV 矩陣訪問

2021-05-14 08:23:07 字數 1402 閱讀 2685

正確的方式

前面介紹的一些讀取和寫入矩陣資料的方式,實際上,你可能很少會使用它們。因為,在大多數情況下,你需要使用最有效率的方式來訪問矩陣中的資料。如果使用以上的函式介面來訪問資料,效率比較低,你應該使用指標方式來直接訪問矩陣中資料。特別是,如果你想遍歷矩陣中所有元素時,就更需要這樣做了。

在用指標直接訪問矩陣元素時,就需要格外注意矩陣結構體中的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 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主...