С использованием FlannBasedMatcher
в OpenCV я получаю разные результаты, вызывая совпадение с одинаковыми параметрами. Может кто-нибудь подсказать, что я делаю не так, пожалуйста?
Приведенный ниже код показывает минимальный пример проблемы, с которой я сталкиваюсь — это упрощенный пример того, как я использую 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
FLANN выбирает между алгоритмом рандомизированного kd-дерева и алгоритмом иерархического дерева k-средних для оптимального приближения ближайших соседей. Выбор алгоритма основан на нескольких факторах, таких как структура набора данных и точность поиска. Каждый алгоритм также имеет набор параметров, которые влияют на производительность поиска.
Это означает, что он использует случайную функцию для сопоставления, поэтому вы каждый раз получаете разные результаты;)