Amacım bir görüntüyü sorgu olarak almak ve en iyi eşleşmeyi bir resim kitaplığında bulmaktır. OpenCV 3.0.0'da SURF özelliklerini kullanıyorum ve bir eşleşme bulmak için The Words of Words yaklaşımını kullanıyorum. Sorgu resminin kitaplıktaki bir eşleşip eşleşmediğini öğrenmenin bir yoluna ihtiyacım var. Eğer varsa, en yakın eşleşme olan resmin dizinini bilmek istiyorum. C++/OpenCV: Hangi kümelerin söz dağarcığındaki resimlerle ilişkili olduğunu belirlemek için BOWImgDescriptorExtractor nasıl kullanılır?
Mat training_descriptors(1, extractor->descriptorSize(), extractor->descriptorType());
//read in all images and set to binary
char filepath[1000];
for (int i = 1; i < trainingSetSize; i++){
cout << "in for loop, iteration: " << i << endl;
_snprintf_s(filepath, 100, "C:/Users/Randal/Desktop/TestCase1Training/%d.bmp", i);
Mat temp = imread(filepath, CV_LOAD_IMAGE_GRAYSCALE);
Mat tempBW;
adaptiveThreshold(temp, tempBW, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);
detector->detect(tempBW, keypoints1);
extractor->compute(tempBW, keypoints1, descriptors1);
training_descriptors.push_back(descriptors1);
cout << "descriptors added" << endl;
}
cout << "Total descriptors: " << training_descriptors.rows << endl;
trainer.add(training_descriptors);
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
BOWImgDescriptorExtractor BOW(extractor, matcher);
Mat library = trainer.cluster();
BOW.setVocabulary(library);
eşimi bulmak için bir girişim aşağıdaki kodu yazmış:
İşte özellikleri (görüntülerin kütüphanesinde 300 toplam) tüm görüntüleri okuma ve ayıklanması ve kümelenme için benim kodudur. Sorun şu ki, BOW.compute, hem görüntü hem de resim kitaplığında bulunan kümelerin (sözcüklerin) indekslerini döndürür. imgQ sorgu görüntüsüdür.
Mat output;
Mat imgQBW;
adaptiveThreshold(imgQ, imgQBW, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 2);
imshow("query image", imgQBW);
detector->detect(imgQBW, keypoints2);
extractor->compute(imgQBW, keypoints2, descriptors2);
BOW.compute(imgQBW, keypoints1, output);
cout << output.row(0) << endl;
BoW'daki hangi kümelerin hangi görüntülere karşılık geldiğini bilmem gerekiyor. Benim çıktım şu anda - output.row (0) - kütüphanede bulunan kümelerin tüm indekslerini içeren bir dizidir. Bu çıktıyı yanlış anladım mı? Hangi görüntünün en fazla eşleşen kümeye sahip olduğunu belirlemek için bir yol var mı?
sizin değişken class_ml türü nedir? dizi? Ayrıca, yukarıdaki kodun tüm kümelenmeden sonra gelmesi gerekiyor, değil mi? – Phazoozoo
Class_ml, ml algoritmasının eğitim için aldığı sınıftır. Adlandırma muhtemelen çok iyi değildi. Bu bir dizgedir evet. Kod, kümelemeden sonra gelir. –