首页 文章

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

提问于
浏览
0

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

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();

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

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

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

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

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

非常感谢!

UPDATE

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

enter image description here

1 回答

  • 0

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

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

    请随意评论并进一步讨论此问题 . :-)

相关问题