转载请注明 t1234xy4原创 : http://blog.csdn.net/t1234xy4/article/details/51713895
相关源码下载连接:http://download.csdn.net/detail/t1234xy4/9554431
目标:利用opencv的直方图表示,求出直方图均值。
一、理解opencv直方图的数据类型
学习连接:http://wiki.opencv.org.cn/index.php/Cv图像处理#CvHistogram
typedef struct CvHistogram { int type; CvArr* bins; float thresh[CV_MAX_DIM][2]; /* for uniform histograms */ float** thresh2; /* for non-uniform histograms */ CvMatND mat; /* embedded matrix header for array histograms */ } CvHistogram;bins : 用于存放直方图每个灰度级数目的数组指针,数组在cvCreateHist 的时候创建,其维数由cvCreateHist 确定(一般以一维比较常见)
bins:也就是我们对像素的分类形成的容器。这里的CvArr* 内部是void的指针,具体解释成什么类型,与使用有关。
可以看到CvHistogram 中的数据保存在CvMatND的结构体中,下面我再学习学习CvMatND。
CvMatND
多维、多通道密集数组
typedef struct CvMatND { int type; /* CvMatND 标识(CV_MATND_MAGIC_VAL), 元素类型和标号*/ int dims; /* 数组维数 */ int* refcount; /* 数据参考计数 */ union { uchar* ptr; short* s; int* i; float* fl; double* db; } data; /* data 指针*/ /* 每维的数据结构 (元素号,以字节为单位的元素之间的距离)是配套定义的 */ struct { int size; int step; } dim[CV_MAX_DIM]; } CvMatND;
特别注意(一维直方图):CvHistogram结构的直方图数据是保存在CvMatND中的,CvMatND结构中dims与type就不说了,struct中的size与step分别是保存在dim[0](一维直方图),二维、三维保存类推。size保存了数据空间的大小,step保存每一维数据的宽度。union data中保存了数据,我猜测是根据直方图输入的数据类型来判定使用哪一种数据指针,经过一些测试,我得到的数据保存在float* fl这个指针所指位置。(估计是默认的)如果不在你试试其他指针。
二、学会使用操作cvHistogram的函数
CreateHist
创建直方图
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );