這裡定義一個函數ecvOutputMatrix,用於打印CvMat的元素。下面有兩個例子。
例一在Debug時有誤,而在Release時沒有問題,這由CV_MAT_ELEM的定義可見,其中有assert表達式,使得CV_MAT_ELEM在Debug情況下只能應用於單通道矩陣,實際上在Release情況下CV_MAT_ELEM還是可以應用於多通道矩陣的。
鑒於CV_MAT_ELEM的缺點,在例二中仿照CV_MAT_ELEM定義了三個宏,分別用於訪問二三四通道矩陣中的元素。注意所定義的宏並沒有保證row,col和cha小於矩陣的行數,列數和通道數,讀者可以自行添加相應的assert表達式。
- #define CV_MAT_ELEM_2(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[2*col+cha])
- #define CV_MAT_ELEM_3(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[3*col+cha])
- #define CV_MAT_ELEM_4(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[4*col+cha])
例一
- #include <cv.h>
- #include <stdio.h>
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- void ecvOutputMatrix(CvMat *mat)
- {
- for(int i=0;i<mat->rows;i++)
- {
- for(int j=0;j<mat->cols;j++)
- {
- int type=cvGetElemType(mat);
- switch(type)
- {
- case CV_8UC1:
- printf("%d\t",CV_MAT_ELEM(*mat,uchar,i,j));
- break;
- case CV_8UC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*2),
- CV_MAT_ELEM(*mat,uchar,i,j*2+1));
- break;
- case CV_8UC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*3),
- CV_MAT_ELEM(*mat,uchar,i,j*3+1),
- CV_MAT_ELEM(*mat,uchar,i,j*3+2));
- break;
- case CV_8UC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*4),
- CV_MAT_ELEM(*mat,uchar,i,j*4+1),
- CV_MAT_ELEM(*mat,uchar,i,j*4+2),
- CV_MAT_ELEM(*mat,uchar,i,j*4+3));
- break;
-
- case CV_8SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,signed char,i,j));
- break;
- case CV_8SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*2),
- CV_MAT_ELEM(*mat,signed char,i,j*2+1));
- break;
- case CV_8SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*3),
- CV_MAT_ELEM(*mat,signed char,i,j*3+1),
- CV_MAT_ELEM(*mat,signed char,i,j*3+2));
- break;
- case CV_8SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*4),
- CV_MAT_ELEM(*mat,signed char,i,j*4+1),
- CV_MAT_ELEM(*mat,signed char,i,j*4+2),
- CV_MAT_ELEM(*mat,signed char,i,j*4+3));
- break;
-
- case CV_16UC1:
- printf("%d\t",CV_MAT_ELEM(*mat,unsigned short,i,j));
- break;
- case CV_16UC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*2),
- CV_MAT_ELEM(*mat,unsigned short,i,j*2+1));
- break;
- case CV_16UC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*3),
- CV_MAT_ELEM(*mat,unsigned short,i,j*3+1),
- CV_MAT_ELEM(*mat,unsigned short,i,j*3+2));
- break;
- case CV_16UC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*4),
- CV_MAT_ELEM(*mat,unsigned short,i,j*4+1),
- CV_MAT_ELEM(*mat,unsigned short,i,j*4+2),
- CV_MAT_ELEM(*mat,unsigned short,i,j*4+3));
- break;
-
- case CV_16SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,short,i,j));
- break;
- case CV_16SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*2),
- CV_MAT_ELEM(*mat,short,i,j*2+1));
- break;
- case CV_16SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*3),
- CV_MAT_ELEM(*mat,short,i,j*3+1),
- CV_MAT_ELEM(*mat,short,i,j*3+2));
- break;
- case CV_16SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*4),
- CV_MAT_ELEM(*mat,short,i,j*4+1),
- CV_MAT_ELEM(*mat,short,i,j*4+2),
- CV_MAT_ELEM(*mat,short,i,j*4+3));
- break;
-
- case CV_32SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,int,i,j));
- break;
- case CV_32SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*2),
- CV_MAT_ELEM(*mat,int,i,j*2+1));
- break;
- case CV_32SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*3),
- CV_MAT_ELEM(*mat,int,i,j*3+1),
- CV_MAT_ELEM(*mat,int,i,j*3+2));
- break;
- case CV_32SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*4),
- CV_MAT_ELEM(*mat,int,i,j*4+1),
- CV_MAT_ELEM(*mat,int,i,j*4+2),
- CV_MAT_ELEM(*mat,int,i,j*4+3));
- break;
-
- case CV_32FC1:
- printf("%lf\t",CV_MAT_ELEM(*mat,float,i,j));
- break;
- case CV_32FC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*2),
- CV_MAT_ELEM(*mat,float,i,j*2+1));
- break;
- case CV_32FC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*3),
- CV_MAT_ELEM(*mat,float,i,j*3+1),
- CV_MAT_ELEM(*mat,float,i,j*3+2));
- break;
- case CV_32FC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*4),
- CV_MAT_ELEM(*mat,float,i,j*4+1),
- CV_MAT_ELEM(*mat,float,i,j*4+2),
- CV_MAT_ELEM(*mat,float,i,j*4+3));
- break;
-
- case CV_64FC1:
- printf("%lf\t",CV_MAT_ELEM(*mat,double,i,j));
- break;
- case CV_64FC2:
- printf("(%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*2),
- CV_MAT_ELEM(*mat,double,i,j*2+1));
- break;
- case CV_64FC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*3),
- CV_MAT_ELEM(*mat,double,i,j*3+1),
- CV_MAT_ELEM(*mat,double,i,j*3+2));
- break;
- case CV_64FC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*4),
- CV_MAT_ELEM(*mat,double,i,j*4+1),
- CV_MAT_ELEM(*mat,double,i,j*4+2),
- CV_MAT_ELEM(*mat,double,i,j*4+3));
- break;
- }
- }
- putchar('\n');
- }
- }
- int main()
- {
- int m[]={
- 255, 255, 255,
- 255, 255, 255,
- 128, 200,1
- };
-
- CvMat M=cvMat(1,3,CV_32SC3,m);
- ecvOutputMatrix(&M);
- cvReleaseData(&M);
-
- return 0;
- }
例二
- #include <cv.h>
- #include <stdio.h>
- #include <highgui.h>
-
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- #pragma comment( lib, "highgui.lib" )
-
- #define CV_MAT_ELEM_2(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[2*col+cha])
- #define CV_MAT_ELEM_3(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[3*col+cha])
- #define CV_MAT_ELEM_4(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[4*col+cha])
-
- void ecvOutputMatrix(CvMat *mat)
- {
- for(int i=0;i<mat->rows;i++)
- {
- for(int j=0;j<mat->cols;j++)
- {
- int type=cvGetElemType(mat);
- switch(type)
- {
- case CV_8UC1:
- printf("%d\t",CV_MAT_ELEM(*mat,uchar,i,j));
- break;
- case CV_8UC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,uchar,i,j,0),
- CV_MAT_ELEM_2(*mat,uchar,i,j,1));
- break;
- case CV_8UC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,uchar,i,j,0),
- CV_MAT_ELEM_3(*mat,uchar,i,j,1),
- CV_MAT_ELEM_3(*mat,uchar,i,j,2));
- break;
- case CV_8UC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,uchar,i,j,0),
- CV_MAT_ELEM_4(*mat,uchar,i,j,1),
- CV_MAT_ELEM_4(*mat,uchar,i,j,2),
- CV_MAT_ELEM_4(*mat,uchar,i,j,3));
- break;
-
- case CV_8SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,signed char,i,j));
- break;
- case CV_8SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,signed char,i,j,0),
- CV_MAT_ELEM_2(*mat,signed char,i,j,1));
- break;
- case CV_8SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,signed char,i,j,0),
- CV_MAT_ELEM_3(*mat,signed char,i,j,1),
- CV_MAT_ELEM_3(*mat,signed char,i,j,2));
- break;
- case CV_8SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,signed char,i,j,0),
- CV_MAT_ELEM_4(*mat,signed char,i,j,1),
- CV_MAT_ELEM_4(*mat,signed char,i,j,2),
- CV_MAT_ELEM_4(*mat,signed char,i,j,3));
- break;
-
- case CV_16UC1:
- printf("%d\t",CV_MAT_ELEM(*mat,unsigned short,i,j));
- break;
- case CV_16UC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,unsigned short,i,j,0),
- CV_MAT_ELEM_2(*mat,unsigned short,i,j,1));
- break;
- case CV_16UC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,unsigned short,i,j,0),
- CV_MAT_ELEM_3(*mat,unsigned short,i,j,1),
- CV_MAT_ELEM_3(*mat,unsigned short,i,j,2));
- break;
- case CV_16UC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,unsigned short,i,j,0),
- CV_MAT_ELEM_4(*mat,unsigned short,i,j,1),
- CV_MAT_ELEM_4(*mat,unsigned short,i,j,2),
- CV_MAT_ELEM_4(*mat,unsigned short,i,j,3));
- break;
-
- case CV_16SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,short,i,j));
- break;
- case CV_16SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,short,i,j,0),
- CV_MAT_ELEM_2(*mat,short,i,j,1));
- break;
- case CV_16SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,short,i,j,0),
- CV_MAT_ELEM_3(*mat,short,i,j,1),
- CV_MAT_ELEM_3(*mat,short,i,j,2));
- break;
- case CV_16SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,short,i,j,0),
- CV_MAT_ELEM_4(*mat,short,i,j,1),
- CV_MAT_ELEM_4(*mat,short,i,j,2),
- CV_MAT_ELEM_4(*mat,short,i,j,3));
- break;
-
- case CV_32SC1:
- printf("%d\t",CV_MAT_ELEM(*mat,int,i,j));
- break;
- case CV_32SC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,int,i,j,0),
- CV_MAT_ELEM_2(*mat,int,i,j,1));
- break;
- case CV_32SC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,int,i,j,0),
- CV_MAT_ELEM_3(*mat,int,i,j,1),
- CV_MAT_ELEM_3(*mat,int,i,j,2));
- break;
- case CV_32SC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,int,i,j,0),
- CV_MAT_ELEM_4(*mat,int,i,j,1),
- CV_MAT_ELEM_4(*mat,int,i,j,2),
- CV_MAT_ELEM_4(*mat,int,i,j,3));
- break;
-
- case CV_32FC1:
- printf("%lf\t",CV_MAT_ELEM(*mat,float,i,j));
- break;
- case CV_32FC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,float,i,j,0),
- CV_MAT_ELEM_2(*mat,float,i,j,1));
- break;
- case CV_32FC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,float,i,j,0),
- CV_MAT_ELEM_3(*mat,float,i,j,1),
- CV_MAT_ELEM_3(*mat,float,i,j,2));
- break;
- case CV_32FC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,float,i,j,0),
- CV_MAT_ELEM_4(*mat,float,i,j,1),
- CV_MAT_ELEM_4(*mat,float,i,j,2),
- CV_MAT_ELEM_4(*mat,float,i,j,3));
- break;
-
- case CV_64FC1:
- printf("%lf\t",CV_MAT_ELEM(*mat,double,i,j));
- break;
- case CV_64FC2:
- printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,double,i,j,0),
- CV_MAT_ELEM_2(*mat,double,i,j,1));
- break;
- case CV_64FC3:
- printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,double,i,j,0),
- CV_MAT_ELEM_3(*mat,double,i,j,1),
- CV_MAT_ELEM_3(*mat,double,i,j,2));
- break;
- case CV_64FC4:
- printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,double,i,j,0),
- CV_MAT_ELEM_4(*mat,double,i,j,1),
- CV_MAT_ELEM_4(*mat,double,i,j,2),
- CV_MAT_ELEM_4(*mat,double,i,j,3));
- break;
- }
- }
- putchar('\n');
- }
- }
- int main()
- {
- int m[]={
- 255, 255, 255,
- 255, 255, 255,
- 128, 200,1
- };
-
- CvMat M=cvMat(1,3,CV_32SC3,m);
- ecvOutputMatrix(&M);
- cvReleaseData(&M);
-
- IplImage *image=cvLoadImage("lena.jpg",-1);
- CvMat mat;
- cvGetMat(image,&mat);
- ecvOutputMatrix(&mat);
- cvReleaseImage(&image);
-
- return 0;
- }