这几天在看直方图计算calcHist的源码,里面采用了查找表加速的技术,不过映射关系有点复杂,看的有点迷糊,仔细分析了一下,发现cv::Mat的元素分布还没有搞清楚,特别是对大于2维的情况,于是又自己研究了一下Mat中的分布,花了半天时间画了个图,发现还是有图有真相啊,维数一高了光靠脑子想就容易混乱,还是画个图比较形象一点。
下面是以一个L*M*N的3维矩阵为例来分析的,大于3维的跟这就大同小异了,总之记住元素的排列规则是:字节组成基础的通道元素,也就是深度类型;然后多个通道的深度类型组成矩阵的元素;多个矩阵的元素排列组成行;多行排列成组成面;多个面排列组成体;多个体排列组成。。。类推;
还是看图比较明白:
下面是一个简单的3维矩阵的程序例子以及输出:
int sz[]={4,3,2}; Mat cube(3, sz, CV_32FC3, Scalar(10.1, 20.2, 30.3)); int channel = 3; for (int i=0; i<sz[0]; ++i) { for (int j=0; j<sz[1]; ++j) { cout<<"["; for (int k=0; k<sz[2]; ++k) { cout<<"("; for(int p=0; p<channel; ++p) { cout<<cube.at<Vec3f>(i,j,k)[p]; if(p<channel-1) cout<<" "; } cout<<")"; } cout<<"]"; } cout<<endl; } cout<<endl; cout<<cube.size[0]<<","<<cube.size[1]<<","<<cube.size[2]<<","<<endl; /* 输出: [(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)] [(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)] [(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)] [(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)][(10.1 20.2 30.3)(10.1 20.2 30.3)] dim0=4,dim1=3,dim2=2 */