码迷,mamicode.com
首页 > 其他好文 > 详细

【练习7.1】cvCreateHist创建直方图、cvCalcHist计算直方图、cvQueryHistValue_1D访问直方图及右左法则

时间:2015-05-06 22:37:40      阅读:1296      评论:0      收藏:0      [点我收藏+]

标签:

 

提纲
题目要求
程序代码
结果图片
要言妙道

 

 

 

  

 

题目要求:

 在0~1之间生成1000个随机值,定义bin的大小为10,并建立一个直方图

a、输出每个bin中的数据

 

程序代码:

 

 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
 2 //
 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg
 4 
 5 #include "stdafx.h"
 6 #include <cv.h>
 7 #include <highgui.h>
 8 #include <iostream>
 9 
10 #include <opencv2/legacy/legacy.hpp>
11 //#pragma comment(lib, "opencv_legacy2411.lib")
12 
13 using namespace cv;
14 using namespace std;
15 
16 //函数声明-->--->-->--->-->--->-->--->//
17 
18 
19 //<--<--<--<--<--<--<--<--<--函数声明//
20 
21 int _tmain(int argc, _TCHAR* argv[])
22 {
23     CvRNG rng;
24     rng = cvRNG(cvGetTickCount());
25     IplImage* src = cvCreateImage(cvSize(10, 100), IPL_DEPTH_32F, 1);
26 
27     for (int i = 0; i < 1000; ++i)
28     {
29         double value = cvRandReal(&rng);
30         cvSetReal1D(src, i, value);
31     }
32 
33     int dims = 1;
34     int sizes[1] = { 10 };
35     int type = CV_HIST_ARRAY;
36     float arr[] = { 0.0f, 1.0f };
37     float * rangs[] = { arr };
38 
39     CvHistogram *histogram = cvCreateHist(dims, sizes, type, rangs, 1);
40     cvCalcHist(&src, histogram);
41 
42     float sum = 0.0f;
43     for (int i = 0; i < 10; ++i)
44     {
45         float value = cvQueryHistValue_1D(histogram, i);
46         cout << value << endl;
47     }
48     
49     system("pause");
50 
51     cvWaitKey();
52     cvReleaseImage(&src);
53     cvDestroyAllWindows();
54     rangs = NULL;
55 
56     return 0;
57 }
58 
59 void DrawHistogram(IplImage * image_hist, const CvHistogram * histogram)
60 {
61 
62 
63 }

 

 

结果图片:

技术分享

 

要言妙道:

 ① cvWaitKey(); 只有在之前调用该cvShowImage后才会等待,如果之前的代码没调过,则必须用 system("pause"); 才能暂停下来

②cvCreateHist的参数sizes必须为整型书中,数组长度等于直方图的维数,数组中每一个整数表示分配给对应维数的bin的个数,例如直方图为一维,sizes必须为只包含一个整型元素的数组,该元素的值即为直方图bin的个数

③cvCreateHist的参数ranges是指向指针的指针,即二维数组,第一维的长度应等于bin的个数,第二维代表各个bin的的范围或分段情况,对于均匀直方图,第二维便是最小值和最大值组成的两个元素的数组;对于有N个bin的非均匀直方图,第二维是由N+1个元素组成的分段情况,例如本题如果使用非均匀可以是{0.0,0.14,0.25,0.31,0.29,0.55,0.60,0.66,0.79,0.82,1.0},这第二维工11个数,相邻的两个数代表一个bin的范围,这样若干个一维数组合成一个二维数组,本题的若干个=1个

④根据右左法则以 float * rangs[] 为例,rangs是一个数组,数组元素的类型为指针,指针式指向float的指针,其实这一点使用 float rangs[] 更容易理解,rangs是一个数组,数组元素是float型。

⑤cvCalcHist计算直方图即根据直方图的参数,算出落在每个bin中数量

⑥cvQueryHistValue_1D等函数即获取各个bin中元素的数量

 

【练习7.1】cvCreateHist创建直方图、cvCalcHist计算直方图、cvQueryHistValue_1D访问直方图及右左法则

标签:

原文地址:http://www.cnblogs.com/tingshuixuan2012/p/4483410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!