视频教程的第七课是说opencv的基本结构体,我就默默的学习了,不记录下来了。现在来说说第八课吧,CvMat结构体。
对于mat这个类型,我从前单纯的觉得,它和数组差不多的。后来,经人指点才发现,mat那是矩阵啊,矩阵是一个多么神奇的存在。
大学那时,高代是一门让我喜爱的课程,因为老师很有趣,哈哈哈哈~但是高代中说到的各种证明,让我晕眩不已啊,也让我深深感受到,这个是一个神奇的存在。
在opencv中,cvMa的定义如下
typedef struct CvMat
{
int type;
//数据类型,通道数等组合的东西,格式是CV_<bit_depth> (S|U|F)C<number_of_channels>例如CV_32FC1(32位浮点型单通道)
int step;//矩阵一行的字节数
/* for internal use only */
int* refcount;
int hdr_refcount;
//数据块,使用联合体
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
//__cplusplus表示C++环境
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
} CvMat;
创建一个矩阵有几种方法
方法一、
使用cvCreateMat(int rows, int cols, int type);//创建矩阵
CvMat* pmat1;//占有空间在32位机器上四个字节的指针地址
pmat1 = cvCreateMat(8,9,CV_32FC1);//为pmat1动态分配空间,
cvReleaseMat(pmat1);
方法二、
先使用cvCreateMatHeader()创建矩阵头,再使用cvCreateData()创建矩阵数据
CvMat* pmat2
pmat2 = cvCreateHeader(4,5,CV_8UC1);//此时pmat2的没有数据块data
cvCreateData(pmat2);
cvReleaseMat(pmat2);
已知一个数组,使用cvInitMatHeader()将数组转换成mat
float data[4] = {3,4,6,0};
CvMat pmat3;
cvInitMatHeader(&pmat3,2,2,CV_32FC1,data);//pmat3的data的地址与data的地址是一样的
方法四、
复制一个已知的cvMat数据
CnMat* pmat4;
pmat4 = cvCloneMat(pmat2);//pmat4和pmat2的空间是独立的
cvReleaseMat(pmat4);