opencv中常见的与图像操作有关的数据结构有Mat,cvMat和IplImage.学习opencv2.0之前的小伙伴可能只接触过cvMat和IplImage。当然在Learn opencv这本经典opencv书中也只介绍到这两种数据结构。在opencv2.0之前,opencv是用纯C编写,在之后加入了C++代码,于是Mat也在这个时候诞生了。现在越来越有趋势取代之前的cvMat和lplImage,相比之下Mat最大的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。
下面我们就来分别介绍三个结构:
CvMat:
在介绍这个结构之前,我们要知道在opencv中没有向量(vector),任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行矩阵)。然后,CvMat继承于CvArr。其次,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更抽象,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值,意思是一个数据单元可以表示几个值,这主要是为了适应表示图像矩阵,毕竟opencv是专门用来处理图像的,在一个图像中,我们知道一个像素点是由三原色构成,这样,在存储图像时,一个矩阵单元就得存储三个值(也可能是一个值或4个值)。
下面我们来看一下cvmat的数据结构:
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((int rows, int cols, int type, void* data ); /*cvMat构造函数用已有数据data初始化矩阵