综述:
CvMat是OpenCV中重要的矩阵变换函数,使用方法为CvMat* cvCreateMat ( int rows, int cols, int type ); 这里type可以是任何预定义类型,预定义类型的结构如下:CV_
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; /*矩阵结构头*/
//此类信息通常被称作为矩阵头。很多程序是区分矩阵头和数据体的,后者是各个data成员所指向的内存位置。
创建CvMat矩阵:
CvMat * cvCreateMat(int rows, int cols, int type); //创建矩阵头并分配内存*/
CV_INLine CvMat cvMat((int rows, int cols, int type, void* data CV_DEFAULT); //用已有数据data初始化矩阵
CvMat * cvInitMatHeader(CvMat * mat, int rows, int cols, int type, void * data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP)); //(用已有数据data创建矩阵头)
对CvMat矩阵数据进行访问:
/*间接访问*/
/*访问CV_32F1和CV_64FC1*/
cvmSet( CvMat* mat, int row, int col, double value);
cvmGet( const CvMat* mat, int row, int col );
/*访问多通道或者其他数据类型: scalar的大小为图像的通道值*/
CvScalar cvGet2D(const CvArr * arr, int idx0, int idx1); //CvArr只作为函数的形参void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);
/*直接访问: 取决于数组的数据类型*/
/*CV_32FC1*/
CvMat * cvmat = cvCreateMat(4, 4, CV_32FC1);
cvmat->data.fl[row * cvmat->cols + col] = (float)3.0;
/*CV_64FC1*/
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);
cvmat->data.db[row * cvmat->cols + col] = 3.0;
/*一般对于单通道*/
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1);
CV_MAT_ELEM(*cvmat, double, row, col) = 3.0; /*double是根据数组的数据类型传入,这个宏不能处理多通道*/
/*一般对于多通道*/
if (CV_MAT_DEPTH(cvmat->type) == CV_32F)
CV_MAT_ELEM_CN(*cvmat, float, row, col * CV_MAT_CN(cvmat->type) + ch) = (float)3.0; // ch为通道值
if (CV_MAT_DEPTH(cvmat->type) == CV_64F)
CV_MAT_ELEM_CN(*cvmat, double, row, col * CV_MAT_CN(cvmat->type) + ch) = 3.0; // ch为通道值
/*多通道数组*/
/*3通道*/
for (int row = 0; row < cvmat->rows; row++)
{
p = cvmat ->data.fl + row * (cvmat->step / 4);
for (int col = 0; col < cvmat->cols; col++)
{
*p = (float) row + col;
*(p+1) = (float)row + col + 1;
*(p+2) = (float)row + col + 2;
p += 3;
}
}
/*2通道*/
CvMat * vector = cvCreateMat(1,3, CV_32SC2);CV_MAT_ELEM(*vector, CvPoint, 0, 0) = cvPoint(100,100);
/*4通道*/
CvMat * vector = cvCreateMat(1,3, CV_64FC4);CV_MAT_ELEM(*vector, CvScalar, 0, 0) = CvScalar(0, 0, 0, 0);
复制CvMat矩阵:
//复制矩阵
CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
CvMat* M2;
M2=cvCloneMat(M1);
总结:
CvMat是OpenCV比较基础的函数,学习OpenCV时应该牢牢掌握其用法,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。
革命尚未成功,同志仍需努力。