Странный результат при сравнении SURF - PullRequest
6 голосов
/ 04 марта 2011

Я пытаюсь реализовать средство распознавания дорожных знаков с помощью методов OpenCV и SURF.Моя проблема в том, что я получаю случайные результаты (иногда действительно точные, иногда явно неправильные), и я не могу понять, почему.Вот как я реализовал сравнение:

  • Сначала я определяю контуры на своем изображении
  • Затем на каждом контуре я использую SURF, чтобы узнать, находится ли внутри знак движения и какой трафикзнак

Обнаружение контура работает очень хорошо: используя размытие по Гауссу и плавный край, мне удается найти контур, подобный этому:

enter image description here

Затем я извлекаю изображение, соответствующее этому контуру, и сравниваю его с изображением шаблона дорожных знаков, таким как:

enter image description here

enter image description here

Возвращает 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.

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

SURF-дескрипторы хороши для сравнения богато текстурированных изображений ... Я думаю, что для них недостаточно текстур в дорожных знаках.

При извлечении дескрипторов в вашем случае располагаются первые "существенные точки"например, в углах прямоугольных меток на обоих знаках (прямоугольник и буква P), для них собираются локальные свойства.Например, как выглядит угол прямоугольника: крупным планом, размытым и в градациях серого.

Затем эти дескрипторы сопоставляются углу прямоугольника с буквы PОни не такие уж и разные ... (поскольку мы не принимаем во внимание информацию о форме).Возможно, углы буквы P немного ближе к углам знака «нет входа».Случайно.

Конечно, все это всего лишь предположение ... единственный способ выяснить это - отладить его полностью.Попробуйте отобразить изображения с маленькими кружочками, в которых были найдены дескрипторы (размер кружка может зависеть от масштаба, в котором была найдена точка).Или поместите оба изображения в один IplImage и нарисуйте линии между соответствующими дескрипторами.Примерно так:

http://www.flickr.com/photos/22191989@N00/268039276

Что касается того, как это исправить ... как насчет того же метода сопоставления формы для внутренней части, который вы используете для обнаружения внешних контуров для трафиказнак?(Например, вы можете искать объекты в форме буквы P, как только найден знак.)

0 голосов
/ 26 апреля 2012

Чтобы оценить сходство между двумя изображениями, я использую соотношение: количество точек goog / общее количество дескрипторов

Я думаю, что это плохая метрика, вам нужно использовать метрику, основанную на векторах дескрипторов, и вы должны использовать пространственную информацию между точками.

Это связано с тем, что SIFT-подобные объекты совпадают только с «одинаковыми точками», но не схожими точками, возможно, вы можете настроить их, изменив критерии сопоставления. Потому что в критериях сопоставления opencv - получить ближайшую точку (по дескриптору) и проверить, есть ли другой дескриптор около 0,6 сходства.

сопоставление дескриптора состоит из двух шагов. Первый шаг следует простому, но мощному алгоритму сопоставления Дэвида Лоу. Точнее, чтобы увидеть, совпадает ли дескриптор A на левом изображении с каким-либо дескриптором на правом изображении или нет, мы сначала вычисляем евклидово расстояние d (A, A ') между дескриптором A на левом изображении со всеми дескрипторами A 'на правильном изображении. Если ближайшее расстояние, скажем, d (A, A1 '), меньше, чем k раз второго ближайшего расстояния, скажем, d (A, A2'), то A и A1 'считаются согласованными. Мы устанавливаем k = 0,6

возможно, вы можете изменить k, но я думаю, что это дает больше ложных срабатываний.

...