Moim celem jest zrobienie zdjęcia jako zapytania i znalezienie najlepszego dopasowania w bibliotece obrazów. Używam funkcji SURF w openCV 3.0.0 i podejścia Bag of Words, aby znaleźć dopasowanie. Potrzebuję sposobu, aby sprawdzić, czy obraz zapytania pasuje do biblioteki. Jeśli tak, chcę znać indeks obrazu, który jest najbliższym dopasowaniem.C++/OpenCV: Jak używać BOWImgDescriptorExtractor do określenia, które klastry odnoszą się do obrazów w słowniku?
Oto mój kod do czytania we wszystkich zdjęć (300 w sumie w bibliotece obrazów) i ekstrakcji i grupowanie cech:
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);
Napisałem następujący kod w próbie znalezienia meczu. Problem polega na tym, że BOW.compute zwraca tylko indeksy klastrów (słów), które istnieją zarówno w obrazie, jak i bibliotece obrazów. imgQ to obraz zapytania.
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;
Muszę wiedzieć, które klastry w BoW odpowiadają, które obrazy. Moje wyjście w tej chwili - output.row (0) - jest po prostu tablicą z wszystkimi indeksami klastrów znalezionych w bibliotece. Czy nie rozumiem tego wyniku? Czy istnieje sposób na określenie, który obraz ma najbardziej pasujące klastry?
Jaki jest typ zmiennej class_ml? ciąg znaków? Ponadto, kod, który masz powyżej, ma przyjść po wszystkich grupowaniu, prawda? – Phazoozoo
Class_ml to klasa, którą algorytm ml otrzymuje podczas treningu. Naming prawdopodobnie nie był tak dobry. To jest łańcuch tak. Kod przychodzi po klastrowaniu tak. –