В настоящее время я работаю над распознаванием образов с использованием SURF в OpenCV. Что у меня пока есть: я написал программу на C #, где я могу выбрать исходное изображение и шаблон, который я хочу найти. После этого я передаю обе картинки в C ++ — dll, где я реализовал программу, использующую OpenCV-SURFdetector, которая возвращает все ключевые точки и сопоставляет обратно с моей C # -программой, где я пытаюсь нарисовать прямоугольник вокруг своих совпадений.
Теперь мой вопрос: существует ли общая мера точности в распознавании образов? Как, например, количество совпадений пропорционально количеству ключевых точек в шаблоне? Или, может быть, разница в размере между моим прямоугольником совпадения и исходным размером изображения шаблона? Какие общие параметры используются, чтобы сказать, является ли совпадение «реальным» и «хорошим»?
Редактировать: Чтобы сделать мой вопрос более понятным. У меня есть несколько совпадающих точек, которые уже имеют пороговое значение minHessian и значение расстояния. После этого я рисую что-то вроде прямоугольника вокруг моих совпадающих точек, как вы можете видеть на моей картинке. Это мой матч. Как я могу сейчас сказать, насколько хорош этот матч? Я уже вычисляю разницу в углах, размерах и цветах между найденным совпадением и моим шаблоном. Но я думаю, что это слишком расплывчато.
Я не уверен на 100% в том, что вы действительно спрашиваете, потому что то, что вы называете «спичкой», расплывчато. Но так как вы сказали, что уже сопоставили свои баллы SURF и упомянутое распознавание образов и использование шаблона, я предполагаю, что, в конечном счете, вы хотите локализовать шаблон в своем изображении и спрашиваете о балле локализации, чтобы решить, нашли ли вы шаблон на картинке или нет.
Это сложная проблема, и я не знаю, было ли найдено хорошее и всегда подходящее решение.
Однако, учитывая ваш подход, вы могли бы проанализировать плотность совпадающих точек на вашем изображении: рассмотрите локальные или глобальные максимумы как возможные местоположения для вашего шаблона (глобальные, если вы знаете, что ваш шаблон появляется на изображении только один раз, локальные, если это возможно) появляются несколько раз) и используйте пороговое значение для плотности, чтобы решить, появится ли шаблон. Эскиз алгоритма может быть примерно таким:
Если вам нравятся статьи по поиску, вы можете проверить следующие для улучшения этого основного алгоритма:
РЕДАКТИРОВАТЬДругой способ решить вашу проблему — попытаться удалить случайно подобранные точки, чтобы оставить только те, которые действительно соответствуют вашему шаблонному изображению. Это может быть сделано путем принудительного ограничения постоянства между близко подобранными точками. Следующая исследовательская статья представляет такой подход: «Сопоставление и поиск контекстно-зависимого логотипа», Х.Сахби, Л.Баллан, Дж.Серра, А.Дел Бимбо, 2010 (однако, это может потребовать некоторых базовых знаний …).
Надеюсь это поможет.
Ну, когда вы сравниваете точки, вы используете какую-то метрику.
Таким образом, результаты или сравнение имеют некоторую результирующую дистанцию.
И чем меньше это расстояние, тем лучше.
Пример кода:
BFMatcher matcher(NORM_L2,true);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
matches.erase(std::remove_if(matches.begin(),matches.end(),bad_dist),matches.end());
где bad_dist
определяется как
bool dist(const DMatch &m) {
return m.distance > 150;
}
В этом коде я избавляюсь от «плохих» совпадений.
Есть много способов сопоставить два шаблона на одном изображении, на самом деле это очень открытая тема в компьютерном зрении, потому что не существует лучшего в мире решения.
Например, если вы знаете, что ваш объект может выглядеть повернутым (я не знаком с SURF, но я полагаю, что дескрипторы инвариантны к вращению, как дескрипторы SIFT), вы можете оценить вращение между шаблоном, имеющимся в обучающем наборе, и шаблоном. вы просто соответствовали. Совпадение с минимальной ошибкой будет лучшим совпадением.
Я рекомендую вам проконсультироваться Компьютерное зрение: алгоритмы и приложения. В нем нет кода, но множество полезных методов обычно используются в компьютерном зрении (большинство из них уже реализованы в opencv).