Поиск креста на изображении

У меня есть набор двоичных изображений, на который мне нужно найти крест (примеры прилагаются). Я использую findcontours для извлечения границ из двоичного изображения. Но я не могу понять, как я могу определить, пересекает ли эта форма (граница) или нет? Возможно, opencv имеет некоторые встроенные методы, которые могут помочь решить эту проблему. Я думал решить эту проблему с помощью машинного обучения, но я думаю, что есть простой способ сделать это. Спасибо!

Cross on binary image

cross on binary image 2

5 ответов


обнаружение объекта Виола-Джонс может быть хорошим началом. Хотя основным использованием алгоритма (AFAIK) является распознавание лиц, он был разработан для любого обнаружения объектов, таких как ваш крест.

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

алгоритм реализован в OpenCV, как cvHaarDetectObjects()


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

  • отклонить все полигоны, которые не имели ровно 12 вершин, необходимых для форма полигона.

  • переупорядочить вершины так, чтобы Кратчайшая длина ребра была первый.

  • создать наилучшую подгонку преобразование который отображает ваши вершины на крест равномерного размера

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

  • Если все остатки находятся в пределах вашего определенного терпимость, вы нашли крест.

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


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


после нескольких дней борьбы я пришел к выводу, что единственный надежный способ здесь-использовать SVM + HOG. Вот и все.


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