void Build_Vocabulary::doKmeansAll(String postFix){
    
    clock_t start, finish;   
    double elapsed_time; 
    
    start = time(NULL);
    cout << "Loading Descriptor Files..." << endl;
	FileStorage fs("training_descriptors_bike_" +postFix+ ".txt", FileStorage::READ);
    Mat training_descriptors_bike;
	fs["training_descriptors"] >> training_descriptors_bike;
	fs.release();	
    
    FileStorage fs1("training_descriptors_cars_" +postFix+ ".txt", FileStorage::READ);
    Mat training_descriptors_cars;
	fs1["training_descriptors"] >> training_descriptors_cars;
	fs1.release();	
    
    FileStorage fs2("training_descriptors_person_" +postFix+ ".txt", FileStorage::READ);
    Mat training_descriptors_person;
	fs2["training_descriptors"] >> training_descriptors_person;
	fs2.release();	
    
    FileStorage fs3("training_descriptors_none_" +postFix+ ".txt", FileStorage::READ);
    Mat training_descriptors_none;
	fs3["training_descriptors"] >> training_descriptors_none;
	fs3.release();	
    
    /*    */
	BOWKMeansTrainer bowtrainer(1000); //num clusters
	bowtrainer.add(training_descriptors_bike);
    bowtrainer.add(training_descriptors_person);
    bowtrainer.add(training_descriptors_cars);
    bowtrainer.add(training_descriptors_none);
	cout << "Clustering Bag-of-Words features..." << endl;
    
	Mat vocabulary = bowtrainer.cluster();
    FileStorage fs4("vocabulary_1000_" +postFix+ ".txt", FileStorage::WRITE);
	fs4 << "vocabulary" << vocabulary;
	fs4.release();
    
    /*    */
    finish=time(NULL);
    elapsed_time = finish-start;
    int hours = (int) elapsed_time / 3600;
    int minutes = (int) (elapsed_time - hours * 3600) / 60;
    int seconds = (int) elapsed_time - hours * 3600 - minutes * 60;
    cout << "Elapsed Time for Clustering: " << hours << ":" << minutes << ":" << seconds << endl << endl;
    cout << "------- Finished Build Vocabulary ---------\n" << endl;
    
}
void Build_Vocabulary::doKmeans(String filename, String itemname){
    
    clock_t start, finish;   
    double elapsed_time; 
    
    start = time(NULL);
    cout << "Loading Descriptor Files..." << endl;
	FileStorage fs("training_descriptors_" + filename + ".txt", FileStorage::READ);
    Mat training_descriptors;
	fs["training_descriptors"] >> training_descriptors;
	fs.release();	
    
    /*    */
	BOWKMeansTrainer bowtrainer(1000); //num clusters
	bowtrainer.add(training_descriptors);
	cout << "Clustering Bag-of-Words features..." << endl;
    
	Mat vocabulary = bowtrainer.cluster();
    FileStorage fs1("vocabulary_" + filename + "_1000.txt", FileStorage::WRITE);
	fs1 << "vocabulary" << vocabulary;
	fs1.release();
    
    /*
     Mat Label, kMeanCenter;
     TermCriteria KmeanTerm(CV_TERMCRIT_EPS, 100, 0.001);
     kmeans(training_descriptors, 1000, Label , KmeanTerm, 2, KMEANS_PP_CENTERS, kMeanCenter);
     */
    
    /*
    FileStorage fs2("kMeans_1000.txt", FileStorage::WRITE);
	fs2 << "label" << Label;
    fs2 << "kMeanCenter" << kMeanCenter;
	fs2.release();
    */
    
    /*    */
    finish=time(NULL);
    elapsed_time = finish-start;
    int hours = (int) elapsed_time / 3600;
    int minutes = (int) (elapsed_time - hours * 3600) / 60;
    int seconds = (int) elapsed_time - hours * 3600 - minutes * 60;
    cout << "Elapsed Time for Clustering: " << hours << ":" << minutes << ":" << seconds << endl << endl;
    cout << "------- Finished Build Vocabulary ---------\n" << endl;
    
}
Esempio n. 3
0
void VisualBOW::createVocabulary(Mat &descriptors)
{
	BOWKMeansTrainer bowtrainer(1000);
	vocabulary = bowtrainer.cluster(descriptors);	
}
int main(int argc, char** argv) {
	string dir = "foodcamimages/TRAIN", filepath;
	DIR *dp;
	struct dirent *dirp;
	struct stat filestat;
	
	dp = opendir( dir.c_str() );
	
	// detecting keypoints
	SurfFeatureDetector detector(400);
	//FastFeatureDetector detector(1,true);
	vector<KeyPoint> keypoints;	
	
	// computing descriptors
	//Ptr<DescriptorExtractor > extractor(new SurfDescriptorExtractor());//  extractor;
	Ptr<DescriptorExtractor > extractor(
		new OpponentColorDescriptorExtractor(
			Ptr<DescriptorExtractor>(new SurfDescriptorExtractor())
			)
		);
	Mat descriptors;
	Mat training_descriptors(1,extractor->descriptorSize(),extractor->descriptorType());
	Mat img;
	
	cout << "------- build vocabulary ---------\n";
	
	cout << "extract descriptors.."<<endl;
	//int count = 0;
	Rect clipping_rect = Rect(0,120,640,480-120);
	Mat bg_ = imread("background.png")(clipping_rect), img_fg;
	while (dirp = readdir( dp ))
    {
	//	count++;
		filepath = dir + "/" + dirp->d_name;
		
		// If the file is a directory (or is in some way invalid) we'll skip it 
		if (stat( filepath.c_str(), &filestat )) continue;
		if (S_ISDIR( filestat.st_mode ))         continue;
		
		img = imread(filepath);
		if (!img.data) {
			continue;
		}
		img = img(clipping_rect);
		img_fg = img - bg_;
		detector.detect(img_fg, keypoints);
//		{
//			Mat out; //img_fg.copyTo(out);
//			drawKeypoints(img, keypoints, out, Scalar(255));
//			imshow("fg",img_fg);
//			imshow("keypoints", out);
//			waitKey(0);
//		}
		extractor->compute(img, keypoints, descriptors);
		
		training_descriptors.push_back(descriptors);
		cout << ".";
    }
	cout << endl;
	closedir( dp );
	
	cout << "Total descriptors: " << training_descriptors.rows << endl;
	
	FileStorage fs("training_descriptors.yml", FileStorage::WRITE);
	fs << "training_descriptors" << training_descriptors;
	fs.release();
    
	BOWKMeansTrainer bowtrainer(1000); //num clusters
	bowtrainer.add(training_descriptors);
	cout << "cluster BOW features" << endl;
	Mat vocabulary = bowtrainer.cluster();
	
	FileStorage fs1("vocabulary_color_1000.yml", FileStorage::WRITE);
	fs1 << "vocabulary" << vocabulary;
	fs1.release();
}