Я пытаюсь вычислить соответствие между двумя изображениями, и на самом деле меня интересует количество точек соответствия, а не сама корреспонденция, чтобы я мог подать в суд на нее, чтобы получить изображение наилучшего соответствия. Это мой следующий код:
#include<iostream>
#include<vector>
#include<string>
#include "cv.h"#include "highgui.h"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/legacy/legacy.hpp"#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/nonfree/nonfree.hpp"#include "opencv2/nonfree/features2d.hpp"#include<stdio.h>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat A = imread("/home/itachi/iTaggproj/frame6.jpg",CV_LOAD_IMAGE_COLOR);
Mat src = imread("/home/itachi/iTaggproj/dataformatch/frame0.jpg",CV_LOAD_IMAGE_COLOR);
SiftFeatureDetector detector( 0.05, 5.0 );
SiftDescriptorExtractor extractor( 3.0 );
vector<KeyPoint>keypoints1,keypoints2;
detector.detect( A, keypoints1 );
detector.detect( src, keypoints2 );
int key1 = keypoints1.size();
int key2 = keypoints2.size();
printf("Keypoint1=%d \nKeypoint2=%d", key1, key2);
// Feature descriptor computation
Mat descriptor1,descriptor2;
extractor.compute( A, keypoints1, descriptor1 );
extractor.compute( src, keypoints2, descriptor2 );
//match points to get correspondence
// BFMatcher matcher(NORM_L2);
FlannBasedMatcher matcher;
vector<DMatch>matches;
matcher.match( descriptor1, descriptor2, matches );
cout<<endl<<matches.size()<<endl;
return 0;
}
Я получил свой код от link1 а также link2. Все мои изображения 320х240. Я взял одно тестовое изображение и попытался запустить его по базе данных изображений одно за другим. Но каждый раз, когда я делаю, размер моих спичек всегда 163. Обратите внимание, что ключевые точки в тестовом изображении также 163. Я пытаюсь найти лучшее соответствие для тестового изображения, но я не понимаю, почему это происходит. Все соответствия соответствий с базой данных дают результат 163.
Это мои вопросы и сомнения, пожалуйста, помогите мне. : —
Извиняюсь, если вопрос довольно зачаточный, но ваша помощь очень ценится.
FlannBasedMatcher.match()
метод не делает то, что вы думаете, он делает; это вернет Лучший соответствовать каждый ключевой момент. Таким образом, у вас всегда будет 163 матча, потому что всегда будет Лучший матч, даже если он не очень хороший.
Что обычно происходит при сопоставлении объектов, так это то, что порог применяется к расстояниям дескриптора; так, например, если любое из совпадений имеет расстояние, превышающее пороговое значение t
затем они отклоняются. Номер хорошо совпадения после определения порога обычно используются для измерения сходства между изображениями. Я думаю, что это число, которое вы ожидали получить.
Ваш код в основном формирует первую часть учебника Вот. Если вы прочитаете учебник, вы увидите именно то, что я описал, где совпадения установлены в соответствии с их расстоянием.
Других решений пока нет …