对OpenCV直方图的数据结构CvHistogram的理解_第1页
对OpenCV直方图的数据结构CvHistogram的理解_第2页
对OpenCV直方图的数据结构CvHistogram的理解_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、前几天被OpenCV的直方图的数据结构CvHistogram弄得很纠结。上网一搜,也没什么相关的资料。现在有点头绪了,就写点东西,让后面的人好走一些吧。先来看看CvHistogram的定义:typedef struct CvHistogram int type; CvArr* bins; float threshCV_MAX_DIM2; /* For uniform histograms. */ float* thresh2; /* For non-uniform histograms. */ CvMatND mat; /* Embedded matrix header for array h

2、istograms. */CvHistogram;第一个成员type,相信大家都见过很多结构都有其。比如:CvMat、CvMatND、IplImage(图像结构中,其用nSize成员代替)。这个成员用来区分各个类型的。OpenCV很多函数的原型都用到了一个CvArr*类型。这个类型说明可以接受一个CvMat或者IplImage类型的指针。这是我们对它的最初理解。其实,看过CvArr定义的人都知道,其实是typedef void CvArr;并非派生关系。 对于OPenCV函数内部,得到的是一个void指针,这时就有必要确切的知道得到的到底是一个什么类型(是CvMat指针还是IplImage指针

3、,还是CvMatND指针)。这样type的作用就体现了。第二个 成员bins。一个CvArr(即void)指针。大家可以先把其理解成一个快捷方式。其等于mat成员的data成员。等一下再说这个成员。第三个成员是thresh。是一个二维数组。而且第二维是2.设想一下,这个函数是求图像的分布像素值(像素灰度值)分布情况。而不同的人,对不同的灰度值感兴趣。这时,OpenCV就必须能够让用户自行指定一个灰度值的范围。这就需要一个上界和下界来指定一个范围。这就是第二维的大小是2的原因。在讲第一维前,先来说说直方图的维数。一开始我对什么“一维直方图”、“二维直方图”不是很明。不知道怎么样才算是二维的。后面

4、找到了一张二维直方图才明白。学习OpenCV、网上都有很多一维的直方图。我也在这里给出一个一维的直方图:一维直方图最重要的还是二维的直方图。二维直方图,其中第一维是16.第二维为8.大家可以在图中看到最左边的8条红柱(当然第一条是白色的)。其红的程度不同。对于其他颜色也是分成了8中不同的程度。一共有16种。下面的是图片的网址,还有代码。BE%E5%83%8F%E9%A2%9C%E8%89%B2%E5%88%86%E5%B8%83%E7%9B%B4%E6%96%B9%E5%9B%BE现在,大家对直方图的维数,应该有一点认识了。现在来说说thresh成员。正是因为直方图可以有多维的,所以,必须得用

5、thresh来指明各维的上下界。所以这个thresh成员是一个二维的指针。现在到了thresh2成员。先一下这个问题:直方图的bin的个数和各个bin的大小 是怎么确定的?bin的个数是通过cvCreateHist函数的参数来设定的。而各个bin的大小就有两种情况了。1:每个bin都一样大。2:每个bin的大小不一样大。对于每个bin一样大的话,bin的大小是比较容易解决的。相信大家都想到了,平均即可,因为有了上下界和bin的个数。而对于种情况就要用到thresh2这个成员了。试想一下,要是不将每一个bin的大小设为一样的话,那么就得由用户自己设定每一个bin的大小(就是设定每一个bin的上下

6、界)。当然要是多维的直方图,那么就要为每一维的所有bin都设定上下界。这就需要一个二维数组来存储这样的数据。从CvHistogram这个结构体可以看到thresh2成员是一个二维指针。这就是thresh2的来由了。最后一个成员mat。这个成员是用来存数据的。前面的bins指针其实是等于mat成员的data的。所以,只能在mat里存放数据了。cvCalcHist函数对图像进行操作后,得到了每一个bin的大小,并存放到mat的data成员指向的内存中。至于bings成员。请看下面的代码 if( type = CV_HIST_ARRAY ) hist->bins = cvInitMatNDHe

7、ader( &hist->mat, dims, sizes, CV_HIST_DEFAULT_TYPE ); cvCreateData( hist->bins ); else if( type = CV_HIST_SPARSE ) hist->bins = cvCreateSparseMat( dims, sizes, CV_HIST_DEFAULT_TYPE );所以,bins成员的值和mat里的data成员的值一样。之所以说是快捷方式,应该可以通过它可以快速得到存放直方图信息的地址。mat成员还有一个dim的结构体。这个结构体的size成员用来存储直方图中各维的bin的个数。而该结构体的step成员是从本维本数据跳到下本维的下一个数据的字节数。比如说,对于前面那个二维直方图的例子。其dim0.step = 32;而dim1.step = 4.对于第二维来说,之所以是4.是因为每一个bin都是用float类型存储的。所以跳4.就像一个float数组。下标为2的地址和下标为3的地址就是相差4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论