《學習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;
    
}



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