CvMat
一个矩阵的建立需要两步
第一步初始化一个对象,作为指向空间的句柄
这个句柄包含了元素的大小,行列数,行长,指向空间的地址。
第二步初始化空间,类似于malloc,需要单独释放的
头部初始化的时候有这些参数
种CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP );
唯一一个有问题的参数是type。可以是以下选项
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
所占的空间是通道*深度
深度就是一个元素占的位数,深度就是一个矩阵的一个点上存的数据内部有几项,比如我存一个像素,就会有三项,RGB
下面的代码比较好的测试和试验了这一部分的内容
double vals[6]={0.86255,-2.56258,2.26351,2.12347,11.1535,2.1535};
float vals1[8]={0.862f,-2.56f,2.263f,2.12f,11.15f,2.15f,0.86f,-2.56f};
//double vals[3][2]={0.86255,-2.56258,2.26351,2.12347,11.1535,2.1535};
CvMat rotmat,rotmat1;
cvInitMatHeader(&rotmat,3,2,CV_32FC2,vals);
cvInitMatHeader(&rotmat1,2,2,CV_32FC2,vals1);
//printf("%p\n",vals);
//printf("%p\n",rotmat.data);
/*for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
printf("vals[%d][%d]:%lf\n",i,j,vals[i][j]);
}*/
for(int i=0;i
{
for(int j=0;j
{
double a=(*(double*)CV_MAT_ELEM_PTR_FAST(rotmat, i, j, sizeof(double)));
//double b=vals[i][j];
double c=*(double *)(cvPtr2D(&rotmat,i,j));
printf("mat[%d][%d]:%lf ",i,j,c);
//printf("vals[%d][%d]:%lf ",i,j,b);
printf("%p ",(double*)CV_MAT_ELEM_PTR_FAST(rotmat, i, j, sizeof(double)));
//printf("%p ",&(vals[i][j]));
printf("%p ",cvPtr2D(&rotmat,i,j));
printf("\n");
}
}
printf("***********************************************************************\n");
for(int i=0;i
{
for(int j=0;j
{
float c=*(float *)(cvPtr2D(&rotmat1,i,j));
float d=*((float *)(cvPtr2D(&rotmat1,i,j))+1);
printf("mat[%d][%d]:%f %f \n",i,j,c,d);
printf("%p %p",(float *)(cvPtr2D(&rotmat1,i,j)),((float *)(cvPtr2D(&rotmat1,i,j))+1));
printf("\n");
}
}
getchar();
//test6();
return 0;
图像的深度:
图片是由一个个像素点构成的,所有不同颜色的像素点构成了一副完整的图像,计算机存储图片是以二进制来进行的。
1 bit : 用一位来存储,那么这个像素点的取值范围就是0或者1,那么我们看来这幅图片要么是黑色要么是白色。
4 bit : 取值范围为 0 到 2 的4次方
8 bit : 来存储像素点的取值范围为 0 到 2 的8次方
以此类推,我们把计算机存储单个像素点所用到的bit为称之为图像的深度.
图像的通道:
我们知道了图片的深度信息,如果是24位的图片他的取值范围为 0 到 2的24次方,这个取值范围是相当的庞大的,那怎么根据图片某像素的深度值来确定那一像素点的颜色呢?
我
们都知道颜色的三元素 Red, Green, Blue.
如果是深度为24=3*8,我们刚好就可以用第一个8位存储Red值,第二个存储Green值,第三个存储Blue值,
2的8次方刚好是255,所以我们一般看到的RGB值都是(0-255,0-255,0-255)这样的值。如果用rgb来表示图片的颜色值,我们称这样
的图片通道为三。