本示例程序主要是通过实例演示高维Mat的寻址方式。
//3,4分别表示行数、列数,所以3*4是一个页面的元素数,2表示有2个3*4 int a=2,b=3,c=4; int size[]={a,b,c}; float* d1=new float[a*b*c]; for(int i=0;i<a*b*c;i++) d1[i] =(float)i; Mat myND=Mat(3,size,CV_32F,d1); cout<<myND.step[0]<<endl;//等于size中的3*4 cout<<myND.step[1]<<endl;//对应size中的4 cout<<myND.step[2]<<endl;//单个元素的字节数 int rows=myND.step1(0)/myND.step1(1); int cols=myND.step1(1); cout<<"rows="<<rows<<endl; cout<<"cols="<<cols<<endl; for(int z=0;z<a;z++) { cout<<endl<<"the "<<z<<"th plane"; for(int y=0;y<rows;y++) { for(int x=0;x<cols;x++) { if(x%cols==0) cout<<endl; uchar*pa=(myND.data+myND.step[0]*z+myND.step[1]*y+myND.step[2]*x); float*pij=(float*)pa; cout<<*pij<<" "; } } cout<<endl; } return 0; }
上面的程序中,访问三维矩阵元素是,采用的方法是.data+step[0]*z+myND.step[1]*y+myND.step[2]*x
Mat的成员函数at(z,y,x)方法,也可以遍历每一个元素:
//3,4分别表示列数、行数,所以3*4是一个页面的元素数,2表示有2个3*4 int a=2,b=3,c=4; int size[]={a,b,c}; float* d1=new float[a*b*c]; for(int i=0;i<a*b*c;i++) d1[i] =(float)i; Mat myND=Mat(3,size,CV_32F,d1); cout<<myND.step[0]<<endl;//等于size中的3*4 cout<<myND.step[1]<<endl;//对应size中的4 cout<<myND.step[2]<<endl;//单个元素的字节数 int rows=myND.step[0]/myND.step[1]; int cols=myND.step[1]/myND.elemSize(); cout<<"rows="<<rows<<endl; cout<<"cols="<<cols<<endl; for(int z=0;z<a;z++) { cout<<endl<<"the "<<z<<"th plane"; for(int y=0;y<rows;y++) { for(int x=0;x<cols;x++) { if(x%cols==0) cout<<endl; float p=myND.at<float>(z,y,x); cout<<p<<" "; } } cout<<endl; } return 0; }
下面是运行结果与上图一致。