openCV中的矩阵创建和释放

来源:互联网 发布:php argv argc 编辑:程序博客网 时间:2024/04/29 23:22

学习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 );

 

 

原创粉丝点击