Подход соответствия формы / образца в компьютерном зрении - PullRequest
6 голосов
/ 27 декабря 2011

В настоящее время я сталкиваюсь с, на мой взгляд, довольно распространенной проблемой, которую должно быть довольно легко решить, но до сих пор все мои сбой не помогли, поэтому я обращаюсь к вам за помощью.

Я думаю, что проблемаобъясняется лучше всего с некоторыми иллюстрациями.У меня есть несколько шаблонов, подобных этим двум:

Pattern 1 Pattern 3

У меня также есть изображение типа (вероятно, лучше, потому что фотография, с которой он был создан, было довольно плохо освещено), это:

Picture

(обратите внимание, как шаблон был масштабирован так, чтобы соответствовать размеру изображения)

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

Я работаю с OpenCV (с привязками Python) и уже пробовал cvMatchTemplate и MatchShapes, но пока он не очень надежно работает.

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

Существуют ли некоторые методы, скрытые в OpenCV, которые я еще не нашел илиЕсть ли известный алгоритм для решения таких проблем, которые я должен переопределить?

С Новым годом.

Ответы [ 3 ]

6 голосов
/ 30 декабря 2011

Может работать несколько простых техник:

  1. После бинаризации и сегментации найдите диаметр шарика по Фере (например, самое дальнее расстояние между точками или большой осью).
  2. Найдите выпуклую оболочку набора точек, залейте ее заливкой и отнеситесь к ней как к соединенной области. Вычтите исходное изображение большим пальцем. Разница будет в области между большим пальцем и кулаком, и положение этой области относительно центра масс должно указывать на вращение.
  3. Используйте алгоритм водораздела на расстоянии каждой точки до края капли. Это может помочь идентифицировать подключенную тонкую область (большой палец).
  4. Укажите самый большой круг (или самый большой вписанный многоугольник) внутри большого объекта. Расширяйте этот круг или многоугольник, пока некоторая часть его края не пересекает фон. Вычтите эту расширенную фигуру из исходного изображения; останется только большой палец.
  5. Если размер руки является постоянным (или относительно постоянным), то вы также можете выполнять N операций морфологической эрозии до тех пор, пока большой палец не исчезнет, ​​тогда N расширяют операции, чтобы увеличить кулак до первоначального приблизительного размера. Вычтите этот шарик только для кулака из исходного шарика, чтобы получить шарик большого пальца. Затем для определения направления используется направление большого пальца (диаметр Фере) и / или центр масс относительно центра масс первого кулачка.

Методы поиска критических точек (областей сильного изменения направления) более хитры. В простейшем случае вы также можете использовать детекторы углов, а затем проверить расстояние от одного угла до другого, чтобы определить место, где внутренний край большого пальца встречает кулак.

Для более сложных методов, посмотрите на статьи о разложении формы авторами, такими как Кимия, Сиддики и Сяофин Ми.

1 голос
/ 30 декабря 2011

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

Вы можете сделать это легко, выбрав точки на белой области и используя Floyd-Warshall .

1 голос
/ 27 декабря 2011

MatchTemplate кажется подходящим решением для проблемы, которую вы описываете. Каким образом это терпит неудачу для вас? Если вы на самом деле маскируете знаки «большие пальцы вверх», «большие пальцы вниз» / «большие пальцы» между ними так же хорошо, как вы показываете на своем образце, то вы уже сделали самую сложную часть.

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

[править] Массив результатов для MatchTemplate содержит целочисленное значение, которое указывает, насколько хорошо подходит шаблон в изображении в этом месте. Если вы используете CV_TM_SQDIFF, то самое низкое значение в массиве результатов - это место наилучшего соответствия, если вы используете CV_TM_CCORR или CV_TM_CCOEFF, то это самое высокое значение. Если все ваши масштабированные и повернутые шаблонные изображения имеют одинаковое количество белых пикселей, вы можете сравнить значение наилучшего соответствия, которое вы найдете для всех различных шаблонных изображений, и шаблонное изображение, которое имеет наилучшее соответствие в целом, является тем, которое вы хотите выбрать.

Существуют тонны независимых функций обнаружения вращения / масштабирования, которые могли бы вам помочь, но нормализация вашей проблемы для работы с MatchTemplate, безусловно, самая простая.

Для более продвинутых вещей, посмотрите SIFT , Классификаторы на основе признаков Хаара или один из других доступных в OpenCV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...