CvPoint这个类型和MFC以及Qt中的相应结构很类似,都是integer类型的x,y。但是它的变体类型是CvPoint2D32f和CvPoint3D32f。前者也是有两个成员,但是是浮点类型的。后者是浮点类型的,而且多了一个z。
CvSize这个类型和CvPoint很相似。在这一章的最后,给出了上述两个类型的C语言定义。CvSize数据成员是integer类型的width和height,如果希望使用浮点类型,可以使用CvSize2D32f。CvRect类型派生于CvPoint和CvSize,包含4个成员,x,y,width,height。
CvScalar包含4个整型成员,CvScalar有一个单独的成员val,它是一个只想4个双精度浮点数数组的指针即double val[4]。这个类型很重要,之后的很多矩阵操作函数中都有他的身影。
CvArr-》CvMat-》IplImage。这里属于依次派生,即CvArr作为剩下两个的父类。在这里和C++很相似,体现了极其浓烈的面向对象编程的思想。因此,我们看到形参表中需要CvArr*类型参数时,就可以考虑将这两者带入,这样就可以进行一系列操作。
OpenCv矩阵的概念相对于线性代数更为抽象,尤其是矩阵的元素,并非只能取数值类型。
矩阵由宽度,高度,类型,行数据长度(step,行的长度用字节表示而不是整形或者浮点型长度)和一个指向数据的指针构成。
typedef struct CvMat { int type; int step; int *refcount; union { uchar*ptr; short* s; int * i; float* fl; double *db; }data; union { int rows; int height; }; union { int cols; int width; }; }CvMat;
上述代码就是CvMat的类型结构,我们可以看到,这其中有三个联合体,在32位系统中,sizeof(CvMat)=24。
矩阵有多种创建方法,最常见的方法是用cvCreateMat()这个函数进行创建。它由多个原函数组成,例如,cvCreateMatHeader()和cvCreateData()。cvCreateMatHeader()函数创建CvMat结构,不为数据分配内存,二cvCreateData()函数只负责数据的内存分配。有时,只需要函数cvCreateMatHeader(),因为已因其他理由分配了存储空间,或因为还不准备分配存储空间。第三种方法使用函数cvCloneMat(CvMat*),他依据一个现有矩阵创建一个新的矩阵。当这个矩阵不再需要时,可以调用函数cvReleaseMat(CvMat*)释放它。上述的几个函数,在手册中基本上就是这个意思。
查询矩阵,我们可以使用函数cvGetElemType(const CvArr* arr),cvGetDims(const CvArr*arr,int *size=NULL)和cvGetDimSize(const CvArr*,int index),第一个返回一个整型常数,表示存储在数组里的元素类型。第二个取出数组以及一个可选择的整形指针,他返回维数,如果整型指针不为空,它将存储对应数组的高度和宽度。最后的函数通过一个指示维数的整型数简单地返回矩阵在那个位数上矩阵的大小。
矩阵数据的存取
宏CV_MAT_ELEM(),传入矩阵、待提取的元素的类型、行和列数4个参数,返回提取出的元素的值。