在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<<element<<endl;
以上使用矩陣中元素的方式很方便,但不幸的是,該宏在每次調用時,都會重新計算指針的位置。這意味着,先查找矩陣數據區中第0個元素的位置,然后,根據參數中的行和列,計算所需要的元素的地址偏移量,然后將地址偏移量與第0個元素的地址相加,獲得所需要的元素的地址。
所以,以上的方式雖然很容易使用,但是卻不是獲得矩陣元素的最好方式。特別是當你要順序遍歷整個矩陣中所有元素時,這種每次對地址的重復計算就更加顯得不合理。