Я пытаюсь написать программу, которая использует алгоритм ORB для обнаружения и вычисления ключевых точек изображения и видео и сопоставляет векторы дескриптора с использованием BruteForce. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю программу на Visual C++, когда объект, который я пытаюсь обнаружить, не отображается, мой алгоритм рисует все предполагаемые совпадающие строки между обнаруженными ключевыми точками (он соответствует всем ключевые точки). Когда объект, который я пытаюсь обнаружить, появляется на изображении, я не сталкиваюсь с этой проблемой, на самом деле я почти не получаю никаких несоответствий.ORB/BruteForce-drawing совпадений, когда их нет
Это краткая последовательность основного теста:
• преобразование входного изображения в оттенки серого
• преобразовывать входные видео в оттенки серого
• выявления ключевых точек и извлечение дескрипторов из входных полутонового изображения
• обнаруживать ключевые точки и извлекать дескрипторы из входных изображений в оттенках серого
• m (см. ниже)
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
double max_dist = 0; double min_dist = 100;
////calcularea distantelor max si min distances intre keypoints
for (int i = 0; i < descriptors_1.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
printf("-- Max dist : %f \n", max_dist);
printf("-- Min dist : %f \n", min_dist);
std::vector<DMatch> good_matches;
for (int i = 0; i < descriptors_1.rows; i++)
{
if (matches[i].distance <= max(2 * min_dist, 0.02))
{
good_matches.push_back(matches[i]);
}
}
////-- Desenarea matches-urilor "bune"
Mat img_matches;
drawMatches(img1, keypoints_1, cadruProcesat, keypoints_2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
////-- Afisare matches
imshow("good matches", img_matches);
int gm = 0;
for (int i = 0; i < (int)good_matches.size(); i++)
{
printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx);
gm += 1;
}
printf("%d",gm);
///////////////////////////////////////////////////////////////////
//imshow(windowName2, cadruProcesat);
switch (waitKey(10)) {
case 27:
//tasta 'esc' a fost apasata(ASCII 27)
return 0;
}
}
return 0;
Пожалуйста, помогите мне найти проблему.
Либо, 'вы не проверяют, когда ваш Keypoints_2 пуст », или проблема находится где-то в другом месте. Получите нам 'matcher.match (дескрипторы_1, дескрипторы_2, совпадения);' для лучшей помощи. – Vtik