介绍CvMat矩阵数据类型的基本信息
数据结构中大部分都使用union,虽然OpenCV是用C编写的,但其思想还是面向对象的。理解起来应该没有很大难度。说一下几个重点:
C语言中常用的数据结构之一,类似的有struct结构体。但是不同的是,struct中的每个属性都是独立的数据,而一个union中的属性是公用一端内存地址的,而这个内存地址的长度是取决于union中最大的数据类型的。所以通常一个union中只有一个属性是有效的。
CvMat的矩阵头中大量使用指针,旨在处理分散的数据,并且使得CvMat的开销变得更小,更灵活。而同样的缺点是,大部分的童鞋对于指针的理解都不太深,主要是自从Java之后都开始弱化指针的概念。
cvInitMatHeader与cvMat都只是简单的创建了一下基本的信息,但是没有初始化数据。然后利用指针将分布的数据链接起来。
例 创建一个简单的CvMat
CvMat * mat=cvCreateMat(5,5,CV_32FC1);
float element_3_2= CV_MAT_ELEM(*mat, float, 3, 2);
上面的两个宏都只能支持1,2D的矩阵,如果超过2D,变为3D或者ND的时候需要使用cvPtr系列函数读取,当然cvPtr自身也支持1D和2D的矩阵。通常这系列的函数都是一样的参数列表(目标矩阵,坐标1,坐标2…,类型);
uchar* cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL));
cvPtr系列是获取指针,故可以修改相关的位置的值。如果只是用于读取可以使用相同签名的cvGet*D函数
其实该函数与get系列函数是对应的,只能对指定位置进行赋值操作。不做过多的解释。
假设需要抽样一个3D系上的的N个点,主要有以下几种方法进行矩阵化:
参数中32F表示32 float,而C3表示channel 3既3通道。
3列分别表示x,y,z坐标。则其数组的形式为
每一行表示一个点,还每个点的0,1,2表示x,y,z坐标则
point[3]={x,y,z}
pints[n]={point1,point2……};
三行分别代表x,y,z坐标,而其位置代表是第几个点。
第一行即{x0,x1,x3….},第二行{y0,y1,y2….}一次类推
如果需要标示一个点则为 [0][i],[1][i],[2][i]
其实3导通就是将每一个通道的值一次排列存在,其内存结构域 N行3列的矩阵是一样的.