如何遍歷Mat

2021-10-25 21:01:04 字數 1455 閱讀 4876

由於mat是類,必須用方法函式訪問,不能用切片方法。

其中:如果是灰度圖則type=uchar;如果是彩色圖則type=vec3b(包含了3個uchar);如果是浮點mat則type=vec3f;如果是int8(short)則type=vec3s;如果是int32則type=vec3i;如果是double則type=vec3d

其中:如果是灰度圖獲得的是元素,如果是彩色圖獲得的是rgb陣列

例項:用at方法訪問mat畫素

int w = image.cols;

int h = image.rows;

for (int row = 0; row < h; row++) }

該指標能夠獲得乙個行指標(指標型別為元素指標),該行指標相當於乙個一維陣列,可使用訪問具體每個元素;

mat image = imread(path);

int w = image.cols;

int h = image.rows;

for (int row = 0; row < h; row++) }

該指標能夠獲得乙個mat首元素指標(指標型別為元素指標);然後可以對該指標進行解引用從而得到畫素值。其中如果是灰度圖,則*pt就是對應畫素值;如果是彩色圖,則*pt, *(pt+1), *(pt+2)風別代表該位置b,g,r畫素值,原因就是指標pt實際上是元素指標,而每個位置b,g,r是連續存放的,所以pt每移動一位就是移動乙個uchar

注意:在迴圈中最好用指標方法訪問畫素這樣速度更快,而如果只是單次訪問某個畫素則可用

at方法比較方便,但速度較慢。

注意:m.ptr

和m.data

的區別,其中

m.ptr(i)

是方法,他能夠返回第

i行首元素的指標,也就是行指標;而

m.data

是屬性,他能夠獲得整個物件的首元素指標。兩者得到的都是指標,因此本質上兩者是一樣的。相對來說

m.ptr

獲取指標的方式更簡潔,且是按行跳躍更為方便定位;但

m.data

則速度更快

(比陣列方式快了

100倍,比

rptr

方式快了50倍

),所以建議使用

m.data

,這種方式也類似與

cuda

**的指標寫法

(首元素位址

)。詳細的速度對比參考:

例項:用data指標方法訪問mat畫素

// 用pdata指標,速度上比前兩種方法快了50~100倍

mat image = imread(path);

int w = image.cols;

int h = image.rows;

for (int row = 0; row < h; row++) }

如何構建平面Mat

基於尺寸構建mat 1.基於rows,cols,type mat img mat src.rows,src.cols,cv 8uc1 2.基於size cols,rows type,注意size的順序是列 行,不是行 列 mat img mat size src.cols,src.rows cv 8...

如何遍歷memcache

如何對memcache的資料 key value 進行遍歷操作 memcache的stats命令包括 1.stats 2.stats reset 3.stats malloc 4.stats maps 5.stats sizes 6.stats slabs 7.stats items 8.stats...

QT和OpenCv聯合之遍歷mat的四種方法

對連續空間的遍歷訪問 mat mat 3000,4000,cv 8uc3 int es mat.elemsize 元素大小位元組數 int size mat.rowsmat.colses 獲取大小 for int i 0 i size i es i時元素的位置 遍歷不連續空間 for int row...