OpenCv矩陣元素的訪問技巧

2021-08-07 08:54:37 字數 1661 閱讀 3113

原文:

cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在

《學習opencv》

一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主要講解通過指標高效訪問cvmat元素的方法z及平時容易忽視的一些小問題。

1.關於元素資料型別

cvmat中資料型別由幾個部分構成 cv_(s|u|f)channels,s表示有符號的,u表示無符號的,f表示浮點數;比如cv_32f1,表示32位1通道浮點數;cv_8u3,表示8位無符號3通道整形;資料型別重要的原因在於

a.它決定了cvmat資料的分布,比如,若元素型別cv_8uc1(常用於灰度影象 ),那麼cvmat的資料排列是每行按照ggggggg(g表示乙個畫素的灰度值)的格式排列;若元素型別為cv_8uc3,則可以表示彩色影象,其行排列成為bgrbgrbgr(分別表示藍綠紅三個通道值,三個通道值表徵1個畫素)的形式;

b.在訪問其資料型別時,如何正確轉換成對應的資料型別指標;後面的例子會說到;

2.訪問cvmat中的元素

簡單的通過cv_mat_elem巨集,cvgetrealxd()函式即可實現,但是影象處理是計算密集型操作,這些函式雖然簡單易用,但是效率比較低。因此最常用的是採用指標來訪問cvmat中的元素。

cvmat結構中data結構對於指標訪問其元素非常重要.

其data成員為

uniondata;

由於是聯合體,因此在訪問時,指標可以在這幾種型別的指標之間轉換。當然這還歸功於cvmat中每行的位元組長度是固定的,成員step記錄了cvmat每行的位元組數。下面的**說明如何高效訪問矩陣元素。

cvmat* mat=cvcreatemat(5,3,cv_32fc1);//建立乙個5行3列的矩陣,元素型別為32位單通道浮點數;資料型別對於後面使用指標訪問矩陣元素非常重要。

cvzero(mat);

int row,col;

//下面的**給矩陣的每個元素賦值

for (row=0;rowheight;row++)

} //下面的3段**功能是一樣的,都是在控制台顯示各個元素的值

///code1

for (row=0;rowheight;row++)

}///code2

for (row=0;rowheight;row++)

std::cout<}

///code 3

for (row=0;rowheight;row++)

std::cout<}

///用指標除了順序訪問cvmat中的元素外,還可以訪問任意位置的元素,當然前提是需要自己計算指標。比如:

for (row=0;rowheight;row++)

}std::cout<

}

cvreleasemat(&mat);//用完釋放相關資源

因此,對cvmat中的元素不要拘泥於書上提供的幾種方式,在程式效率很重要的情況下,可以合理使用指標結合step完美的訪問cvmat中的元素,當然,使用指標,也有缺點,出現錯誤不容易發現,自己曾經遭過道。

OpenCv矩陣元素的訪問技巧

本文 cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在 學習opencv 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主...

OpenCV 矩陣訪問

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

OpenCV 矩陣訪問

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