一、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");
}