opencv中CvMat结构与矩阵的创建与访问

一、CvMat结构:

typedef struct CvMat
{
    int type;    
    int step;

    /* for internal use only */
    int* refcount;
    int hdr_refcount;

    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;

type:表示数据元素的类型,其格式为:CV_8UC1,表示8位无符号数单通道类型,也可以是16、32、64位,有符号,双通道、三通道等类型。
step:每一行的字节数
union:在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址,一般这个空间选择为union中数据类型占空间最大。

二、矩阵的创建:四种方法
1、直接调用cvCreateMat

CvMat* pmat1 = cvCreateMat(6, 6, CV_8UC1);

2、

CvMat* pmat2 = cvCreateMatHeader(5, 9, CV_32FC1); cvCreateData(pmat2);

3、

CvMat pmat3;
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
cvInitMatHeader(&pmat3, 2, 5, CV_8UC1,a);

4、

CvMat* pmat4 = cvCloneMat(pmat1);

注意:
//其中pmat1、pmat2、pmat4需要调用cvReleaseMat函数释放空间;
//pmat3不需要,因为它所存储的是int数组的地址,并没有为pmat3分配空。

cvReleaseMat(&pmat1);
cvReleaseMat(&pmat2);
cvReleaseMat(&pmat4);

三、矩阵的访问

//矩阵维度与通道
    float data[18] = { 
        30, 60, 40, 60, 50, 40, 
        67, 88, 55, 33, 22, 97,
        59, 69, 32, 46, 25, 45
    };


    //2维单通道
    printf("二维单通道:\n");
    CvMat mat;
    cvInitMatHeader(&mat, 3, 6, CV_32FC1, data);
    for (int i = 0; i < mat.rows; i++)
    {
        for (int j = 0; j < mat.cols; j++)
        {
            float value = cvGetReal2D(&mat,i,j);
            printf("%f ", value);
        }
        printf("\n");
    }

    //2维2通道
    printf("二维双通道:\n");
    CvMat mat2;
    cvInitMatHeader(&mat2, 3, 3, CV_32FC2, data);
    for (int i = 0; i < mat2.rows; i++)
    {
        for (int j = 0; j < mat2.cols; j++)
        {
            CvScalar value = cvGet2D(&mat2, i, j);
            printf("(%f %f)", value.val[0],value.val[1]);
        }
        printf("\n");
    }

    //2维3通道
    printf("二维三通道:\n");
    CvMat mat3;
    cvInitMatHeader(&mat3, 3, 2, CV_32FC3, data);
    for (int i = 0; i < mat3.rows; i++)
    {
        for (int j = 0; j < mat3.cols; j++)
        {
            CvScalar value = cvGet2D(&mat2, i, j);
            printf("(%f %f %f)", value.val[0], value.val[1],value.val[2]);
        }
        printf("\n");
    }

opencv中CvMat结构与矩阵的创建与访问_第1张图片

你可能感兴趣的:(opencv,CvMat)