Mat img=imread("E:\\res\\lena.jpg");
Ptr<FeatureDetector> features = FeatureDetector::create("SIFT");
Ptr<DescriptorExtractor> descriptors = DescriptorExtractor::create("SIFT");
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
//defining terms for bowkmeans trainer
TermCriteria tc(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 10, 0.001);
BOWImgDescriptorExtractor bowDE(descriptors, matcher);
//training data now
Mat features1;
vector<KeyPoint> keypoints1;
features->detect(img, keypoints1);
descriptors->compute(img, keypoints1, features1);
cout<<features1.rows<<endl;
int dictionarySize = 1000;
int retries = 1;
int flags = KMEANS_PP_CENTERS;
BOWKMeansTrainer bowTrainer(dictionarySize, tc, retries, flags);
bowTrainer.add(features1);
bowTrainer.add(features1);
Mat dictionary = bowTrainer.cluster();
cout<<dictionary.rows<<endl;
cout<<dictionary.cols<<endl;
bowDE.setVocabulary(dictionary);
Mat bow_descriptor;
bowDE.compute(img, keypoints1, bow_descriptor);
cout<<bow_descriptor<<endl;
opencv 利用sift特征进行bow的分类训练
最新推荐文章于 2019-10-21 20:44:38 发布