学习openCV中对于其矩阵总是搞混,现在通过学习,算是有一点理解,同大家分享一下
一矩阵的创建
(1)CvMat* cvCreateMat( int rows, int cols, int type );
创建矩阵,并为其分配内存。
CvMat* myCvMat=cvCreateMat(10,10,CV_32FC1);与下面相等
CvMat* mat2=cvCreateMatHeader(10,10,CV_32FC1);//不为数据分配内存
cvCreateData(mat2);
rows矩阵行数。cols矩阵列数。type矩阵元素类型。 通常以 CV_<比特数>(S|U|F)C<通道数>型式描述,例如:
CV_8UC1 意思是一个8-bit 无符号单通道矩阵, CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。
函数 cvCreateMat 为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针。是下列操作的缩写型式:
(2)CvMat* cvCreateMatHeader( int rows, int cols, int type );
创建矩阵头,不为数据分配内存。如果需要分配数据的话用cvCreateData(CvMat* mat)只负责数据内存的分配
CvMat* mat2=cvCreateMatHeader(10,10,CV_32FC1);//不为数据分配内存
cvCreateData(mat2);
(3)CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP) );
创建矩阵头。data可选的,将指向数据指针分配给矩阵头.step排列后的数据的整个行宽,默认状态下,使用STEP的最小可能值。也就是说默认情况下假定矩阵的行与行之间无隙.
函数 cvInitMatHeader 初始化已经分配了的 CvMat 结构. 它可以被OpenCV矩阵函数用于处理原始数据。
double a[] = { 1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12 };
CvMat Ma;
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );//只分配矩阵头
cvInitMatHeader( &Ma, 3, 4, CV_64FC1);//不分配空间
(4)Mat
CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))
{
CvMat m;
assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );
type = CV_MAT_TYPE(type);
m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;
m.cols = cols;
m.rows = rows;
m.step = m.cols*CV_ELEM_SIZE(type);
m.data.ptr = (uchar*)data;
m.refcount = NULL;
m.hdr_refcount = 0;
return m;
}
初始化矩阵头。同(3)。float A[]={1,1,2,2};
CvMat mat1=cvMat(2,2,CV_32FC1,A);
二矩阵的释放
(1)ReleaseMat
删除矩阵
void cvReleaseMat( CvMat** mat );
mat
双指针指向矩阵.
函数cvReleaseMat 缩减矩阵数据参考计数并且释放矩阵头 :
if( *mat )
cvDecRefData( *mat );
cvFree( (void**)mat );