Сопоставление контуров - поиск смещения контуров

17

Я нашел контуры на двух изображениях с одним и тем же объектом и хочу найти смещение и вращение этого объекта. Я пробовал вращать ограничивающие рамки этих контуров, а затем их углы и центральные точки, но повороты ограничивающих рамок не дают правильного представления о вращении контура, потому что это одинаково для углов a + 0, a + 90, a + 180 и т. Д. градусов. Есть ли другой хороший способ найти вращение и смещение контуров? Может быть, какое-то использование выпуклой оболочки, дефектов выпуклости? Я читал в Изучении OpenCv о соответствующих контурах, но это не помогло. Может ли кто-нибудь привести пример?

Примеры:

1 2 3 4

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

krzych
источник
Здесь поможет
картинка
Я хочу сделать какую-то универсальную функцию. Так что в качестве тестовой картинки может быть что угодно. Элемент простой формы в виде прямоугольника или немного более сложной формы.
krzych
2
Ну, вы не можете использовать один метод для всех случаев. Практический метод зависит от диапазона контрастности, оценки шума, фона и самой формы - это гладкость, топология и т. Д. Именно поэтому картинка может помочь.
mirror2image

Ответы:

4

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

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

Дима
источник
Да, масштаб также может отличаться. Я также подумал о чем-то похожем на цепочки фрименов из opencv, создавая цепочки фрименов каждого контура, а затем сравнивая их и пытаясь найти транслатон, но я не могу найти какой-то хороший алгоритм для этого.
krzych
Это то же самое, что создать ограничивающий прямоугольник с минимальным вращением и его вращение и перемещение. Пробовал этот подход и результаты неудовлетворительные. Поэтому я думаю, что этот метод совсем не годится.
krzych
Можете ли вы быть более конкретным относительно того, почему это не сработало? Связаны ли контуры только перемещением, вращением и масштабированием, или они могут быть деформированы другими способами? Некоторые картинки действительно помогут. Если вам нужно обработать неаффинные преобразования или случайный шум, вы можете попробовать контекст формы. Дайте мне знать, я могу указать вам некоторые бумаги.
Дима
Они связаны только перемещением, вращением и масштабированием, деформации связаны с небольшим различением контуров на разных фотографиях. Сформировать контекст? Не могли бы вы расширить это?
krzych
1
@ kzych Похоже, вашей самой большой проблемой здесь будет шум при обнаружении краев. Как вы находите минимально повернутый ящик? Я до сих пор не понимаю, почему это не работает правильно. Контекст формы - это способ представления контура. Подробности здесь: en.wikipedia.org/wiki/Shape_context
Дима
2

Если вам не нужно беспокоиться о масштабах или проективных искажениях, здесь могут помочь цепочки кодов. Если у вас есть цепочечные коды примерно одинаковой формы с одинаковым масштабом, вы можете найти перевод с одномерной фазовой корреляцией БПФ http://en.wikipedia.org/wiki/Phase_correlation

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

mirror2image
источник
Любой совет, как создать хороший код цепи? Может, что-нибудь из OpenCv (насколько я знаю, у него есть только цепочки фрименов)? Сейчас я строю коды цепочек, используя каждую точку контура и вычисляя угол к оси х соседних точек, но, может быть, есть идея получше? Если у вас есть ссылки на какие-либо хорошие статьи о цепях, это будет оценено.
krzych
2

В вопросе вы говорите

Как я уже сказал, я хочу сделать что-то универсальное

но, боюсь, довольно сложно найти «универсальное» решение проблемы.

Вы можете купить имеющееся в продаже программное обеспечение для поиска шаблонов и интегрировать его в свое приложение, как правило, оно работает достаточно хорошо для широкого спектра приложений. Просто чтобы дать вам представление, это справочное руководство для такого продукта http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

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

В противном случае вы можете усердно изучить проблему, начиная с самых базовых основ, основанных на вычислительной геометрии ( http://www.cs.sunysb.edu/~algorith/files/shape-s Similarity.shtml ), где называются ваши «контуры» "многоугольник", читая такие вещи, как:

М. де Берг, О. Девиллерс, М. Кревельд, О. Шварцкопф и М. Тейло. Вычисление максимального перекрытия двух выпуклых многоугольников при переводах. Теоретическая информатика, 31: 613–628, 1998.

и

Х. Ан, О. Чеонг, К. Парк, С. Шин и А. Вигнерон. Максимизация перекрытия двух плоских выпуклых множеств при жестких движениях. Вычислительная геометрия: теория и приложения, 37: 3–15, 2007.

и заканчивая «Иерархическим распознаванием составных объектов в изображениях в реальном времени» Маркуса Ульриха, который сотрудничает с MVTec , еще одной компанией, продающей инструменты для распознавания объектов.

Алессандро Якопсон
источник