Question

I have got a vector of Mat files and I want to calculate the correlation between them so as to keep the two mat files with which are theoretical similar. Actually in this vector are stored detected eyes from images, so I am trying to delete outliers. How is it possible to calculate correlation between two Mat files???

EDIT:

Mat Detection::hist_calculation(Mat image){

    // Establish the number of bins
    int histSize = 256;

    // Set the ranges
    float range[] = { 0, 256 } ;
    const float* histRange = { range };

    bool uniform = true; bool accumulate = false;

    Mat hist;

    // Compute the histograms:
    calcHist( &image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );


    // Draw the histograms for B, G and R
    int hist_w = 512; int hist_h = 400;
    int bin_w = cvRound( (double) hist_w/histSize );

    Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );

    normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );

    for( int i = 1; i < histSize; i++ )
    {
        line( histImage, Point( bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1)) ) ,
            Point( bin_w*(i),   hist_h - cvRound(hist.at<float>(i))   ) ,
            Scalar( 255, 0, 0), 2, 8, 0  );
    }

    //// Display
    //namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE );
    //imshow("calcHist Demo", histImage );
    //waitKey(0);

    return hist;
}

double Detection::cvMatHistCorrelation(Mat file1, Mat file2) {

    cvtColor(file1, file1, CV_BGR2GRAY); cvtColor(file2, file2, CV_BGR2GRAY);
    Mat hist1 = hist_calculation(file1);
    Mat hist2 = hist_calculation(file2);

    double autoCorrelation1 = compareHist( hist1, hist1, CV_COMP_BHATTACHARYYA );
    double autoCorrelation2 = compareHist( hist1, hist1, CV_COMP_BHATTACHARYYA );
    double correlation  = compareHist( hist1, hist2, CV_COMP_BHATTACHARYYA );

    cout << "autocorrelation of his1: "<< autoCorrelation1 << endl;
    cout << "autocorrelation of hist2: "<< autoCorrelation2 << endl;
    cout << "correlation between hist1 and hist2: "<< autoCorrelation << endl;

    return correlation;
}

I think it works fine.

Was it helpful?

Solution

It's better to compute the correlation of feature vectors of these two Mat files instead of on the Mat data directly.

For example, you can first compute RGB/HSV color histogram (24d vector if use 8-bins for each channel) for each Mat file and then compute correlation of these two histogram vectors.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top