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); }