opencv中Mat的賦值和訪問(一)

2021-07-22 17:15:09 字數 1400 閱讀 8515

opencv中mat的賦值和訪問(一)

在opencv中有三種方式訪問矩陣中的資料元素:容易的方式,困難的方式,以及正確的方式。今天主要講容易方式:

最容易的方式是使用巨集cv_mat_elem( matrix, elemtype, row, col ),

輸入引數是矩陣,不是指標,網上有很多人說是指標,矩陣元素型別,行,列,返回值是相應行,列的矩陣元素。cv_mat_elem可以給矩陣賦值,也可以訪問矩陣元素。

cv_mat_elem巨集實際上會呼叫cv_mat_elem_ptr(matrix,row,col)巨集來完成任務。cv_mat_elem_ptr()巨集的引數是矩陣,行,列。cv_mat_elem()巨集和cv_mat_elem_ptr()巨集的區別是,在呼叫cv_mat_elem時,指向矩陣元素的指標的資料型別已經依據輸入引數中的元素型別而做了強制轉換:

如下程式:

cvmat* mat = cvcreatemat(3,3,cv_32fc1);//建立矩陣

cvzero(mat);//將矩陣置0

//為矩陣元素賦值

cv_mat_elem( *mat, float, 0, 0 ) = 1.f; 

cv_mat_elem( *mat, float, 0, 1 ) = 2.f;

cv_mat_elem( *mat, float, 0, 2 ) = 3.f;

cv_mat_elem( *mat, float, 1, 0 ) = 4.f;

cv_mat_elem( *mat, float, 1, 1 ) = 5.f;

cv_mat_elem( *mat, float, 1, 2 ) = 6.f;

cv_mat_elem( *mat, float, 2, 0 ) = 7.f;

cv_mat_elem( *mat, float, 2, 1 ) = 8.f;

cv_mat_elem( *mat, float, 2, 2 ) = 9.f;

//獲得矩陣元素的值

float element = cv_mat_elem(*mat,float,2,2);

float element_1_1 = 7.7f;

*((float*)cv_mat_elem_ptr(m, 1, 1)) = element_1_1;

float element = cv_mat_elem(m,float, 1,1 );

cout<

以上使用矩陣中元素的方式很方便,但不幸的是,該巨集在每次呼叫時,都會重新計算指標的位置。這意味著,先查詢矩陣資料區中第0個元素的位置,然後,根據引數中的行和列,計算所需要的元素的位址偏移量,然後將位址偏移量與第0個元素的位址相加,獲得所需要的元素的位址。

所以,以上的方式雖然很容易使用,但是卻不是獲得矩陣元素的最好方式。特別是當你要順序遍歷整個矩陣中所有元素時,這種每次對位址的重複計算就更加顯得不合理。

opencv的mat賦值 opencvmat賦值

cv mat depth dims channels step data elemsize mat 矩陣中資料元素的位址計算公式 addr mi0,i opencv mat 類 cv mat depth dims channels.本文主要講講怎樣對 mat 矩陣進行 mask 操作,其實也就是對 ...

opencv中的Mat詳解

1.初始化 mat the basic image container 最最基本的函式,所有在opencv中都是用mat形式來操作的。初始化乙個mat mat a,c a imread ar 1 imread color mat b a 複製a給b c a 賦值運算 mat d a,rect 10,...

opencv中Mat的屬性

類似cv 8uc1是mat的型別,其定義為type cv 位數 資料型別 通道數 cv 8uc1 0 cv 8uc2 8 cv 8uc3 16 cv 8uc4 24 depth 0 cv 8sc1 1 cv 8sc2 9 cv 8sc3 17 cv 8sc4 25 depth 1 cv 16uc1 ...