从文件加载数据时opencv的descriptor_extractor_matcher的匹配结果不同

时间:2014-10-30 15:52:22

标签: opencv matching surf feature-extraction orb

我在descriptor_extractor_matcher.cpp示例中使用以下代码来计算img1(Mat descriptors01)的描述符,将其写入我的磁盘并加载回来(Mat描述符1)。 (关键点的步骤相同,但代码非常相似......)

    Ptr<DescriptorExtractor> descriptorExtractor = DescriptorExtractor::create( argv[2] );

...

Mat descriptors01;
descriptorExtractor->compute( img1, keypoints1, descriptors01 ); // compute descriptors

FileStorage storage("test.yml", FileStorage::WRITE);             //save it to disc
storage << "blub" << descriptors01;
storage.release();

Mat descriptors1;
FileStorage storage1("test.yml", FileStorage::READ);            // load it again
storage1["blub"] >> descriptors1;
storage1.release();

关键点&amp;计算和使用图像2的描述符而不保存和加载。

我只使用图像1的加载数据(关键点和描述符)进行匹配,因此对于描述符:descriptors1。

现在就是这样:如果我比较案件
A)使用上面的代码进行计算,存储和加载;
B)仅使用加载的数据(不计算并再次存储)

匹配我得到不同的结果,你可以在图片中看到关键点以及匹配的描述符。我本以为没有差别......我在这里想念的是什么?我必须比较2个图像,并且无法将图像与存储的关键点集及其描述符进行比较吗?

当然我对[detectorType] [descriptorType] [matcherType] [matcherFilterType] [image1] [image2] [ransacReprojThreshold]使用相同的值,顺便说一下;)

非常感谢!

更新

似乎问题取决于描述符。使用加载的描述符适用于SIFT和SURF,但不适用于ORB和其他。图像:案例A和B具有不同描述符的结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

尝试单独重复A或B,看看结果是否相同。我怀疑他们不会这样说,因为,#1你感兴趣的对象质地很差,这会导致描述不佳。 #2两个图像之间的视点变化很大,即使对于像SIFT这样的最佳描述符,也会导致不可重复的问题。

现在,如何解决这个重复性问题,#1在描述符的范数上使用一些阈值,以便只使用非常强大的特征进行匹配。 #2使用极线约束和RANSAC来过滤掉错误的匹配。我附上了两张图片,以显示过滤器如何极大地影响对应关系。 enter image description here 使用SURF查找两个图像之间的对应关系(红色 - 青色色图中的两个图像) enter image description here 使用RIPAC使用极线约束过滤图像后。

随意发表评论并进一步讨论此问题。 : - )