《学习OpenCV》第七章课后题一
7.1 在0-1之间生成1000个随机值ri,定义一个bin的大小,并且建立一个直方图几1/ri。
在每一个bin中元素数是否相同(正负差值在10内即可)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
#define cvQueryHistValue_1D( hist, idx0 ) cvGetReal1D( (hist)->bins, (idx0) )
int main(int argc, const char * argv[]) {
/*1、生成一个随机种子*/
CvRNG rng;
rng = cvRNG(cvGetTickCount());
/*2、创建一个1*1000的图像,实际上就是一个Vector*/
IplImage * Img = cvCreateImage(cvSize(1, 1000), IPL_DEPTH_32F, 1);
cout<<Img->widthStep<<endl;
cout<<Img->width<<endl;
cout<<Img->height<<endl;
/*3、对图像进行赋值*/
for(int i = 0;i<1000;i++)
{
cvSet1D(Img, i, cvScalar(cvRandReal(&rng)));
}
/*4、查看Img存储的数据是否正确,注意Img的depth,提取data需要保存位float*/
int count = 0;
for(int i = 0;i<Img->height;i++)
{
float * ptr =(float *)(Img->imageData + i * Img->widthStep); //存的是float,用char提取会强制阶段了
for(int j = 0;j<Img->width;j++)
{
count++;
cout<<count <<" -> "<<(float)(ptr[j])<<endl;
}
}
cout<<"**********************************************"<<endl;
/*5、创建hist,直方图数据块 */
int dims = 1; //维度是1
int bins = 5;
int hist_size[] = {bins};
float rags[] = {0,1}; //采用均匀直方图,ranges的上下边界位0和1,bins值位5,所以【0,0.2】,【0.2,0.4】...
float * ranges[] = {rags}; //指针数组
CvHistogram * hist = cvCreateHist(dims, hist_size, CV_HIST_ARRAY,ranges,1);
/*5、累计每个区域内的值的个数*/
int arr[5] = {0};
for(int i = 0;i<1000;i++)
{
float value = cvGetReal1D(Img, i);
if(value<0.2)
{
arr[0]++;
}
else if (value < 0.4)
{
arr[1]++;
}
else if (value < 0.6)
{
arr[2]++;
}
else if (value < 0.8)
{
arr[3]++;
}
else
{
arr[4]++;
}
}
for(int i = 0;i<5;i++)
{
cout<<arr[i]<<endl;
}
/*6、计算直方图*/
cvCalcHist(&Img, hist , 0 ,0);
/*7、取直方图的值*/
for (int j = 0; j < bins; j++)
{
double values = cvQueryHistValue_1D(hist,j);
cout<<"the bins of "<< j<<":"<<values<<endl;
}
return 1;
}