#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <vector>
#include <fstream>
#include <string>
#include <iostream>
#include <cxcore.h>
#include <cv.h>
#include <highgui.h>


using namespace std;

CvScalar BackgroundAvg(const IplImage* img, int border_size)
{
    IplImage* mask = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    cvSet(mask, CV_RGB(255, 255, 255));
    for (int x = border_size; x<mask->width - border_size; ++x)
        for (int y = border_size;y<mask->height - border_size; ++y)
        {
            int pixel = y*mask->widthStep + x;
            mask->imageData[pixel] = 0;
        }
    CvScalar res = cvAvg(img, mask);
    cvReleaseImage(&mask);
    return res;       
}

int getdir (const std::string& dir, vector<string> &files, const std::string& extension = "")
{
    DIR *dp;
    struct dirent *dirp;
    if((dp  = opendir(dir.c_str())) == NULL) {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }

    while ((dirp = readdir(dp)) != NULL) 
    {     
        std::string name = dirp->d_name;
        if (extension != "")        
        {
           if (name.length() > extension.length())
              if ( name.substr( name.length() - extension.length(), extension.length() ) == extension )
                 files.push_back(name);
        }
        else 
             files.push_back(name);
    }
    
    closedir(dp);
    
    return 0;
}

int main()
{
    const std::string CLASS = "leuk";
    const std::string dir = "U:\\aved_classifier_data\\complete\\" + CLASS + "\\";
    vector<string> files = vector<string>();

    cvNamedWindow("Image");
    getdir(dir,files, ".jpg");
    
    CvMoments moments;    
    CvHuMoments hu_moments;
    double* hu[7] = {&hu_moments.hu1, &hu_moments.hu2, &hu_moments.hu3,
                     &hu_moments.hu4, &hu_moments.hu5, &hu_moments.hu6, 
                     &hu_moments.hu7};
                     
    std::ofstream ofile( (CLASS + ".txt").c_str() );
    
    IplImage* img = 0;
    for (unsigned int i = 0; i<files.size();i++) 
    {   
        std::string img_name = dir + files[i];
        std::cout << i << "/" << files.size() << " " << img_name << std::endl;
        img = cvLoadImage( img_name.c_str() );
        if (img)
        {
           IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
           cvCvtColor(img, gray, CV_BGR2GRAY);

           CvScalar bkg_avg = BackgroundAvg(gray, 10);
           //cvSubS(gray, bkg_avg, gray);
           
           //cvThreshold(gray, gray, 10, 255, CV_THRESH_BINARY);
                      
           cvMoments(gray, &moments);
           
           cvGetHuMoments(&moments, &hu_moments);
           cvShowImage("Image", gray);
           cvWaitKey(1);
           for (int k = 0; k<7; ++k)
               ofile << (*(hu[k])) << "\t";
           ofile << std::endl;
           
           cvReleaseImage(&gray);
           cvReleaseImage(&img); 
        }        
    }
    system("pause");
    return 0;
}
