Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164374
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-26 00:58
文章分类
文章存档

2014年(2)

2013年(41)

我的朋友

分类: C/C++

2013-03-11 19:35:54

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来表示图片的颜色值,我们称这样 的图片通道为三。

阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~