您的位置:首页 > 运维架构

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

2016-03-23 21:59 459 查看
一、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");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: