示例#1
0
void createTrainingDescriptors(vector<string> trainImages) {

	//Mat img;
	//string filepath;
	cout << "create training descriptors" << endl;
	Ptr<FeatureDetector> detector = FeatureDetector::create(detector_type);
	Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create(extractor_type);
	if (detector_type == "SURF") {
		detector->set("hessianThreshold", minHessian);
		extractor->set("hessianThreshold", minHessian);
	}
	//Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create(extractor_type);
	
	
	Mat *training_descriptors = new Mat();
	/* Extracting features from training set thar contains all classes */
	for (int i = 0; i < trainImages.size(); i++) {
		string filepath = dataset_dir + trainImages[i];
		if (!fileExists(filepath)) {
			cout << "Error opening file! " << endl;
			cout << "Error in: " << filepath << endl;
			continue;
		}

		vector<KeyPoint> keypoints;
		Mat img = imread(filepath, CV_LOAD_IMAGE_COLOR);
		detector->detect(img, keypoints);

		Mat descriptors;
		extractor->compute(img, keypoints, descriptors);
		training_descriptors->push_back(descriptors);

		if (i % 500 == 0)
			cout << "Iteration: " << i << " of " << trainImages.size() << endl;
	}

	cout << "Finished training descriptors" << endl;

	// Creates vocabulary
	cout << "Going to do vocabulary" << endl;
	/* Creating the vocabulary (bag of words) */
	BOWKMeansTrainer *bowtrainer = new BOWKMeansTrainer(numClusters);

	
	bowtrainer->add(*training_descriptors);

	delete training_descriptors;
	
	vocabulary = bowtrainer->cluster();

	delete bowtrainer;

	FileStorage fs("vocabulary.yml", FileStorage::WRITE);
	fs << "vocabulary" << vocabulary;
	fs.release();
	

	cout << "Finished vocabulary creation (1)" << endl;

}
void BOW::train(const char *imagepath, const char *imagelists) {
    BOWKMeansTrainer trainer = BOWKMeansTrainer(200);
    Ptr<DescriptorExtractor> desext = SIFT::create();
    vector<KeyPoint> kps;
    Mat desp;
    Mat img;
    static char fullpath[100], filename[100];
    printf("Computing descriptors..\n");
    FILE* fin = fopen(imagelists, "r");
    int imgnum;
    fscanf(fin, "%d", &imgnum);
    int skipimg = 10;
    double kpratio = 0.3;
    for (int i = 0; i < imgnum; ++i)
    {
        fscanf(fin, "%s", filename);
        printf("%s, %d of %d..", filename, i+1, imgnum);
        if (i % skipimg)
        {
            printf("skipped\n");
            continue;
        }
        sprintf(fullpath, "%s%s", imagepath, filename);
        img = imread(fullpath);
//        if (img.rows > 100 && img.cols > 100)
//            img = Mat(img, Range(img.rows/5, img.rows*4/5), Range(img.cols/5, img.cols*4/5));
        if (img.cols > 300 || img.rows > 300)
        {
            double fr = min(300.0/img.rows, 300.0/img.cols);
            resize(img, img, Size(), fr, fr, INTER_AREA);
        }
        //GaussianBlur(img, img, Size(5, 5), 1.5, 1.5, BORDER_REPLICATE);
        ImgBGReplace(img, img);
        m_fd->detect(img, kps);
//        Mat show;
//        drawKeypoints(img, kps, show);
//        imshow("", show);
//        waitKey();
        desext->compute(img, kps, desp);
        static int idx[5000];
        for (int j = 0; j < desp.rows; ++j) idx[j] = j;
        int selectedkp = (int)(desp.rows * kpratio);
        for (int j = 0; j < selectedkp; ++j)
        {
            int r = rand() % (desp.rows - j);
            swap(idx[j], idx[r]);
            trainer.add(desp.row(idx[j]));
        }
        printf("Complete\n");
    }
    fclose(fin);
    printf("Complete\n");
    printf("%d descriptors extracted.\n", trainer.descriptorsCount());

    printf("Clustering...");
    desp = trainer.cluster();
    m_ext->setVocabulary(desp);
    printf("Complete\n");
}
void clusterFeatures()
{
	Mat dictionary = bowTrainer.cluster();
	bowExtractor.setVocabulary(dictionary);
}