FlannBasedMatcher 返回不同的结果

4
使用OpenCV中的FlannBasedMatcher,我用相同的参数调用匹配器时得到了不同的结果。请问有人能建议我做错了什么吗?
下面的代码展示了我遇到的问题的最小化示例 - 它是我使用FlannBasedMatcher的简化版本 - 这不是真正的代码 :)
循环每次输出的结果应该是相同的,但它们并不相同。
    int const k = std::min(query_descriptors.rows,
                      std::min(train_descriptors.rows, 2));

    cv::Mat query_descriptors_original = query_descriptors.clone();
    cv::Mat train_descriptors_original = train_descriptors.clone();
    for (int loop=0; loop<2; ++loop)
    {
        cv::FlannBasedMatcher matcher;
        matcher.add(std::vector<cv::Mat>(1, train_descriptors));

        std::vector<matches_t> knnMatches;
        matcher.knnMatch(query_descriptors,  knnMatches, k);

        matches.clear();
        for (auto const &knn : knnMatches)
        {
            matches.push_back(knn[0]);
            std::cout << knn[0].queryIdx << ',' << knn[0].trainIdx << '\n';
        }
        std::cout << '\n';

        assert(cv::countNonZero(query_descriptors != query_descriptors_original) == 0);
        assert(cv::countNonZero(train_descriptors != train_descriptors_original) == 0);
    }
}

输出结果是,尽管我不认为它会有帮助(?):
0,27
1,170
2,100
3,100
4,123
5,100
6,191
7,71
8,191
9,67
10,27
11,45
12,302
13,190
14,248
15,158
16,262
17,248
18,211
19,67
20,248
21,275

0,2
1,200
2,224
3,302
4,130
5,302
6,191
7,195
8,191
9,195
10,200
11,45
12,248
13,277
14,248
15,255
16,262
17,248
18,182
19,14
20,54
21,284

我遇到了一个几乎相似的问题,我正在使用flannbased knn match(opencv 3.1)来查找图像拼接的匹配。如果我使用3张图片,它会为每个图像对给出相同的结果集。如果我对4张图片运行相同的代码,则先前存在的图像对的knn_matches会发生变化,但在每次重新运行时都是相同的。你能解释一下为什么吗? - Garvita Tiwari
我想知道你能否解决这个问题。我也遇到了这个问题。 - user6172474
1个回答

5
FLANN选择随机化kd树算法和分层k均值树算法来实现最佳的最近邻近似。算法的选择基于多种因素,如数据集结构和搜索精度。每个算法还有一组参数,它们会影响搜索性能。
这意味着它使用一个随机函数进行匹配,这就是为什么每次都会得到不同的结果 ;)

感谢确认。我理解近似值在具有一致描述符的情况下是稳定的,而不是随机的。现在很清楚了。 - cdmh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接