Я использую OpenCV 3.3.
Я хочу использовать функцию соответствия OpenCV C ++ для объекта типа Vector Dmatch.
Цель состоит в том, чтобы сопоставить дескрипторы из одного изображения запроса с дескрипторами из списка из нескольких изображений.
Я знаю, что когда эта функция используется для сопоставления дескрипторов одного изображения с дескрипторами другого отдельного изображения, индексы двух ключевых точек, соответствующие каждому подходящему дескриптору на каждом изображении, сохраняются в каждом объекте Dmatch из вектора.
Например, если я сделаю
Mat img_1=imread("path1...");
Mat img_2=imread("path2...");
vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
detector->detectAndCompute(img_1, Mat(), keypoints_1, descriptors_1 );
detector->detectAndCompute( img_2, Mat(), keypoints_2, descriptors_2 );
FlannBasedMatcher matcher;
vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );
затем, если я хочу получить доступ к ключевым точкам, которые были сопоставлены, для каждого i, который является int, который уступает match.size (), то
int idx=matches[i].trainIdx;
int idy=matches[i].queryIdx;
point2f matched_point1=keypoints1[idx].pt;
point2f matched_point2=keypoints2[idy].pt;
Однако, что происходит, когда я пытаюсь сопоставить дескрипторы из одного изображения запроса с дескрипторами из списка из нескольких изображений, так как каждый объект Dmatch может содержать только два индекса, в то время как я хочу сопоставить более двух изображений.
то есть:
vector<Mat> descriptors1;
Mat descriptors2;
matcher.add( descriptors1 );
matcher.train();
matcher.match(descriptors2, matches );
что будут означать эти индексы?
int idx=matches[i].trainIdx;
int idy=matches[i].queryIdx;
Вы можете сохранить совпадающие значения индекса для всех изображений поезда в списке, просматривая изображения. Затем вы можете выбрать подходящие точки и играть с ними так, как вы хотите.
Других решений пока нет …