void OrbFeatures(cv::Mat in_image) { cv::OrbFeatureDetector orb(500); std::vector< cv::KeyPoint > keypoints; orb.detect(in_image, keypoints); cv::OrbDescriptorExtractor extractor; cv::Mat descriptors; cv::Mat training_descriptors(1, extractor.descriptorSize(), extractor.descriptorType()); extractor.compute(in_image, keypoints, descriptors); training_descriptors.push_back(descriptors); cv::BOWKMeansTrainer bow_trainer(2); bow_trainer.add(descriptors); cv::Mat vocabulary = bow_trainer.cluster(); }
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(); }