通过将单个查询图像与多个图像的列表匹配来存储关键点索引

Posted

技术标签:

【中文标题】通过将单个查询图像与多个图像的列表匹配来存储关键点索引【英文标题】:Storing keypoints indexes from matching a single query image with a list of several images 【发布时间】:2017-07-20 14:55:49 【问题描述】:

我正在使用 OpenCV 3.3。 我想对 Vector Dmatch 类型的对象使用 OpenCV C++ 匹配函数。 目标是将来自单个查询图像的描述符与来自多个图像列表的描述符进行匹配。 我知道当这个函数用于将单个图像的描述符匹配到另一个单个图像的描述符时,每个图像上的每个匹配描述符对应的两个关键点索引都存储到向量中的每个 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 是一个低于 match.size() 的 int,那么

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;

【问题讨论】:

【参考方案1】:

您可以在遍历图像时将所有火车图像的匹配索引值存储到一个列表中。然后,您可以选择适当的匹配点并随心所欲地使用它们。

【讨论】:

以上是关于通过将单个查询图像与多个图像的列表匹配来存储关键点索引的主要内容,如果未能解决你的问题,请参考以下文章

在 Mat 结构/列表中存储关键点和描述符

使用 SIFT 将图像与数据库匹配

将 ORB 特征与阈值匹配

使用SIFT搜索图像数据库

在单个图像中检测多个图像

将资产列表(数组)保存到特定的 CKRecord