opencv中的高维矩阵Mat

 本示例程序主要是通过实例演示高维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;
}

下面是运行结果与上图一致。

原文地址:https://www.cnblogs.com/phoenixdsg/p/6908029.html