现在的位置: 首页 > 综合 > 正文

OpenCV深入学习(7)–Mat的元素分布图示详解

2012年08月07日 ⁄ 综合 ⁄ 共 1089字 ⁄ 字号 评论关闭

        这几天在看直方图计算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
*/

抱歉!评论已关闭.