FlannBasedMatcher返回不同的结果

时间:2014-05-01 10:09:08

标签: c++ opencv flann flannbasedmatcher

在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

1 个答案:

答案 0 :(得分:4)

FLANN在随机kd树算法和分层k均值树算法之间进行选择,以使最优邻近邻域近似。算法的选择基于数据集结构和搜索精度等几个因素。每个算法还有一组影响搜索性能的参数。

这意味着它使用随机函数进行匹配,这就是为什么每次都会得到不同的结果;)

相关问题