OpenCV中矩阵的定义

  • Post author:
  • Post category:其他


在我们讨论IplImage之前,我们需要看另一个数据类型:CvMat,即OpenCV的矩阵类型。尽管OpenCV是用C语言实现的,但是CvMat和IplImage的关系其实就类似于C++中的类的继承关系。IplImage类继承自CvMat类。所以,我们最好先了解一下IplImage的基类CvMat类的情况,然后再看更复杂的IplImage类。而CvArr类,是CvMat类的抽象基类。正因为CvArr类是基类,所以当我们看到OpenCV的函数参数为CvArr*类型的参数时,我们可以代入CvMat*或者IplImage*类型的实参。


CvMat矩阵数据结构


当我们学习CvMat之前,我们必须知道两个事情,首先OpenCV中是没有”vector(向量)”数据类型的,当我们需要一个”vector”时,我们就使用一个三行一列的矩阵。其次,OpenCV中矩阵的概念比线性代数中矩阵的概念更抽象和复杂一些一些。例如,创建矩阵的函数:CvMat* cvCreateMat(int rows,int cols,int type),其中type代表预定义的数据类型,即矩阵中每一个元素的数据类型,该类型的形式是:CV_<bit数>(S|U|F)C<通道数>,例如,数据类型可能是CV32FC1,即32bit的浮点数,或CV_8UC3,8bit的无符号整数,或CV_8UC3,无符号8bit整数,3通道,等等。我们会发现,cvMat里,矩阵中行和列上的每一个元素,不必是一个单独的数字,可能是一系列数字(有几个通道就有几个数字)。每一个元素可以代表多个值,就允许了我们在矩阵中包含一个RGB的图像。


从内部的结构上看,CvMat相当的简单,我们可以通过代码看一下该数据结构的原型(代码在…/opencv/cxcore/include/cxtypes.h):


其中包含了width,height,type,step(是一行元素的长度,与width类似,但以字节计算),以及指向数据的指针.你可以通过CvMat数据类型的变量直接接触该类型内部的成员,例如,CvMat* matrix ,就可以用matrix->height,matrix->width来获得矩阵的尺寸。又或者通过OpenCV的函数来获得。例如,可以用cvGetSize(CvMat*)来获得CvSize对象,这代表该矩阵的长和宽。


typedef struct CvMat


{



int type;


int step;

/* for internal use only */


int* refcount;


int hdr_refcount;

union


{



uchar* ptr;


short* s;


int* i;


float* fl;


double* db;


} data;

#ifdef __cplusplus


union


{



int rows;


int height;


};

union


{



int cols;


int wid



版权声明:本文为conanlrj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。