2015-10-29 12 views
5

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ı?

cevap

0

Ben de bu koduna göre benzer bir şey yaptı:

https://github.com/royshil/FoodcamClassifier/blob/master/training_common.cpp

Ama kümeleme bittikten sonra yukarıdaki parçasıdır. Yapmanız gereken, ML'nizi (SVM kullandım) ve küme merkezlerinizi, sahip olduğunuz kelimelerin görsel çantasını kullanarak antrenman yapmaktır. Daha çok, kümelenmiş noktalarınızın tüm "en yakın" noktalarını bulmanız ve histogramları kullanarak eğitmeniz gerekir. Daha sonra, antrenman yapmanız gereken bir histogram grafiğine sahip olacaksınız. Daha

Ptr<ifstream> ifs(new ifstream("training.txt")); 
int total_samples_in_file = 0; 
vector<string> classes_names; 
vector<string> lines; 

//read from the file - ifs and put into a vector 
for(int i=0;i<lines.size();i++) { 

    vector<KeyPoint> keypoints; 
    Mat response_hist; 
    Mat img; 
    string filepath; 

    string line(lines[i]); 
    istringstream iss(line); 

    iss >> filepath; 

    string class_to_train; 
    iss >> class_to_train; 
    class_ml = "class_" + class_to_train; 
    if(class_ml.size() == 0) continue; 

    img = imread(filepath); 

    detector->detect(img,keypoints); 
    bowide.compute(img, keypoints, response_hist); 

    cout << "."; cout.flush(); 
    //here create the logic for the class to train(class_0, e.g) and the data you need to train. 
} 

bu git projesinde: burada bulabilirsiniz
https://github.com/royshil/FoodcamClassifier
Dokümantasyon:
http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

+0

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

+0

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. –

İlgili konular