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

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章