《学习OpenCV》第七章直方图(练习7.1)

来源:互联网 发布:华为软件研发面试题 编辑:程序博客网 时间:2024/05/29 03:34

《学习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;    }



原创粉丝点击