knnMatch с k = 2 возвращает 0 ближайшего соседа даже с обученными изображениями

Я в основном извлекаю много ключевых точек с SURF из похожих изображений и добавляю их в BFMatcher(NORM_L2)

Во время выполнения может случиться так, что я добавлю новые ключевые точки к своему сопоставителю с matcher->add(myNewDescriptors);

Теперь, когда я добавил изображение только с 1 ключевой точкой / дескриптором и использую knnMatch, оно не возвращает совпадений:

matcher->knnMatch(queryDesc,matches,2);

Через некоторое время я получаю вектор с 0 ближайшим соседом:

for(auto i = 0; i <matches.size(); i++) {
cout << "matches size: "<<matches[i].size()<<endl;
//> PRINTS: "matches size: 0"

Это происходит только тогда, когда я вставил изображение только с 1 ключевой точкой / дескриптором. До этого knnMatch работает нормально.

Я пытался проверить, если matcher.getTrainDescriptors(); содержит мои дескрипторы и эффективно он содержит все. Чтобы проверить это, если я сделаю:

cout << matcher->getTrainDescriptors().at(0).size(); // (Get the size of the descriptors Mat associated to the first training image)

Я получаю: [128 х 32]. Это означает, что дескрипторы есть, но knnMatches возвращают пустой вектор

Также учтите, что если я изменю .knnMatch с помощью простого .match, то совпадение вернет все DMatches нормально! Код не работает только с knnMatch


OpenCV: 2.4.5

5

Решение

Я думаю, что это ошибка. Я написал простой скрипт для проверки этого. Пожалуйста, если кто-то хочет подтвердить, это поможет.

Этот скрипт извлекает первые 100 ключевых точек на изображении, а затем выделяет 1 ключевую точку. Оба набора дескрипторов хранятся внутри совпадения с помощью .add.

Затем, если вы запустите его, вы увидите, что с помощью .match код работает. При использовании knnMatch совпадение не возвращает ничего:

Ptr<FeatureDetector> d = new OrbFeatureDetector();
Ptr<DescriptorExtractor> e = new OrbDescriptorExtractor();
Ptr<DescriptorMatcher> m = new BFMatcher(NORM_HAMMING);//> The first iteration will extract 100 keypoints and store them
//> The second iteration will extract 1 keypoint
for(int i=100;i>0;i=i-99) {
d = new OrbFeatureDetector(i);
Mat image = imread("train.png",0);
vector<KeyPoint> kp;
d->detect(image,kp);
cout << "detected: "<<kp.size()<<endl;

Mat desc;
e->compute(image,kp,desc);
cout << "descriptor size: "<<desc.size()<<endl;

vector<Mat> addDesc;
addDesc.push_back(desc);
m->add( addDesc );

}

//> Test match and knnMatch
d = new OrbFeatureDetector(100);
Mat image = imread("query.png",0);
vector<KeyPoint> kp;

d->detect(image,kp);
Mat queryDesc;
e->compute(image,kp,queryDesc);vector<DMatch> matches;
m->match(queryDesc,matches);cout << "Parsing matches: "<<matches.size()<<endl;
for(int i=0;i<matches.size();i++)
cout << "Matches[i].distance: "<<matches[i].distance<<endl;vector<vector<DMatch>> matches2;
m->knnMatch(queryDesc,matches2,2);cout << "Parsing matches: "<<matches2.size()<<endl;
for(int i=0;i<matches2.size();i++)
cout << "matches size: "<<matches2[i].size()<<endl; //> THIS SHOULDN'T OUTPUT size: 0!

С этим кодом вызов .match вернет правильный результат. Но knnMatch не работает!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]