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