2015-10-29 8 views
5

Il mio obiettivo è prendere un'immagine come una query e trovare la sua migliore corrispondenza in una libreria di immagini. Sto usando le funzioni SURF, in openCV 3.0.0 e l'approccio Bag of Words per trovare una corrispondenza. Ho bisogno di un modo per scoprire se l'immagine della query ha una corrispondenza nella libreria. Se lo fa, voglio sapere l'indice dell'immagine che è la corrispondenza più vicina.C++/OpenCV: come utilizzare BOWImgDescriptorExtractor per determinare quali cluster si riferiscono a quali immagini nel vocabolario?

Ecco il mio codice per la lettura in tutte le immagini (300 in totale nella libreria di immagini) e l'estrazione e il clustering delle caratteristiche:

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

ho scritto il seguente codice nel tentativo di trovare una corrispondenza. Il problema è che BOW.compute restituisce solo gli indici di cluster (parole) esistenti sia nell'immagine che nella libreria di immagini. imgQ è l'immagine della query.

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; 

Ho bisogno di sapere quali cluster nel BoW corrispondono a quali immagini. Il mio output adesso - output.row (0) - è solo un array con tutti gli indici dei cluster trovati nella libreria. Sto fraintendendo questa uscita? C'è un modo per determinare quale immagine ha i cluster più corrispondenti?

risposta

0

ho anche fatto qualcosa di simile sulla base di questo codice:

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

Ma la parte sopra è dopo il raggruppamento ha terminato. Quello che devi fare è allenarti usando il tuo ML (io ho usato SVM) e il tuo cluster center, il sacchetto visivo di parole che hai. Inoltre, è necessario trovare tutti i punti "più vicini" ai punti del cluster e addestrarli utilizzando gli istogrammi. Successivamente, avrai un istogramma di frequenze (sacchetto di punti chiave) che dovrai allenare.

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

Più potete trovare a questo progetto git:
https://github.com/royshil/FoodcamClassifier
documentazione qui:
http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/

+0

Qual è il tipo di class_ml variabili? una stringa? Inoltre, il codice che hai sopra dovrebbe venire dopo tutto il clustering, giusto? – Phazoozoo

+0

Class_ml è la classe che l'algoritmo ml riceve per l'allenamento. Naming probabilmente non era così buono. È una stringa sì. Il codice viene dopo il clustering sì. –

Problemi correlati