Я пытаюсь реализовать средство распознавания дорожных знаков с помощью методов OpenCV и SURF.Моя проблема в том, что я получаю случайные результаты (иногда действительно точные, иногда явно неправильные), и я не могу понять, почему.Вот как я реализовал сравнение:
- Сначала я определяю контуры на своем изображении
- Затем на каждом контуре я использую SURF, чтобы узнать, находится ли внутри знак движения и какой трафикзнак
Обнаружение контура работает очень хорошо: используя размытие по Гауссу и плавный край, мне удается найти контур, подобный этому:
Затем я извлекаю изображение, соответствующее этому контуру, и сравниваю его с изображением шаблона дорожных знаков, таким как:
Возвращает cvExtractSURF189 дескрипторов для контурного изображения.Затем я использую метод naiveNearestNeighbor, чтобы выяснить сходство между моим контурным изображением и каждым шаблоном изображения.
Вот мои результаты:
6/189 для первого шаблона (это то, что я ожидаю найти)
92/189 для второго шаблона (который, очевидно, сильно отличается во всех отношениях от контурного изображения)
Я действительно не понимаю этих результатов…
Вот список шагов, которые я выполняю:
- Превратить контурное изображение в оттенки серого
- Превратить изображение шаблона в оттенки серого
- Выравнивание гистограммы контурного изображения (cvEqualizeHist)
- Изменение размера изображения шаблона, чтобы оно соответствовало контурному изображению
- Размытие изображения шаблона (cvSmooth)
- Размытие контурного изображения (cvSmooth)
- Выполнение cvExtractSURF на шаблонном изображении
- Выполнение cvExtractSURF на контурном изображении
- Для каждого дескриптора или контурного изображения, которое я делаюНаивный Ближайшийighbor
- Я храню количество «хороших» баллов
Чтобы оценить сходство между двумя изображениями, я использую соотношение:
количество баллов goog / всегоколичество дескрипторов
PS: Для информации я следовал этому уроку: http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp
И использовал образец OpenCV для find_obj, чтобы адаптировать его в C.