Збіги контурів - знаходження зміщення контурів


17

Я знайшов контури на двох зображеннях з одним і тим же об'єктом і хочу знайти зміщення та обертання цього об'єкта. Я намагався з обертовими обмежувальними полями цього контуру, а потім його кутами та центральними точками, але обертання обмежувальних коробок не вказують правильно на обертання контуру, оскільки це однаково для кутів a + 0, a + 90, a + 180 тощо. градусів. Чи є ще якийсь хороший спосіб знайти обертання та зміщення контурів? Можливо, якесь використання опуклого корпусу, дефектів опуклості? Я читав у навчанні OpenCv про відповідність контурів, але це не допомогло. Чи може хтось навести приклад?

Приклади:

1 2 3 4

Я хочу виявити, наприклад, рожевий квадрат, а у другому випадку ручку. Іншими прикладами можуть бути квадрати з деякими отворами, зірками тощо. Як я вже сказав, я хочу зробити якусь універсальну річ. Будь-які пропозиції вдячні, тому що я хочу протестувати якомога більше методів.


Зображення допоможе тут
mirror2image

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

2
Ну, ви не можете підібрати єдиний метод до всіх випадків. Практичний метод залежить від діапазону контрастності, оцінки шуму, самого фону та форми - це гладкість, топологія тощо. Ось чому б допомогла картина.
mirror2image

Відповіді:


4

Чи потрібно турбуватися про різницю в масштабі між контурами? Якщо ні, то ви можете просто знайти центроїд кожного контуру та обчислити зміщення, віднімаючи один від іншого. Потім можна обчислити основні осі контурів і знайти кут повороту між ними.

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


Так, масштаб може також відрізнятися. Я думав також про щось подібне до ланцюгів Freeman з opencv, що робить фрімен-ланцюги кожного контуру, а потім порівнюючи їх і намагаючись знайти транлатон якимось чином, але я не можу розробити якийсь хороший алгоритм для цього.
krzych

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

Чи можете ви бути більш конкретними, чому це не вийшло? Чи контури пов'язані лише за допомогою перекладу, обертання та масштабування, або вони можуть деформуватися іншими способами? Деякі фотографії справді допоможуть. Якщо вам потрібно обробити неафіційні перетворення або випадковий шум, ви можете спробувати контекст форми. Дайте мені знати, я можу вказати вам на деякі документи.
Діма

Вони пов'язані лише перекладом, обертанням і масштабуванням, деформації пов'язані з мало різним виявленням контуру на різних фотографіях. Контекст форми? Чи можете ви розширити це?
krzych

1
@kzych Схоже, вашою найбільшою проблемою тут буде шум у виявленні ребер. Як ви знаходите мінімальний обернутий ящик? Мені все одно не зрозуміло, чому це не працює правильно. Контекст форми - це спосіб подання контуру. Докладні відомості тут: en.wikipedia.org/wiki/Shape_context
Діма

2

Якщо вам не доведеться турбуватися про масштабні чи проективні спотворення, тут можуть допомогти коди ланцюга. Якщо у вас є коди ланцюга приблизно однакової форми з однаковою шкалою, ви можете знайти переклад з одномірною фазовою кореляцією FFT http://en.wikipedia.org/wiki/Phase_correlation

Якщо вам доведеться враховувати проективне спотворення, ви також можете розглянути можливість використання точок функції (наприклад, кутів) замість контурів.


Будь-яка порада, як створити хороший ланцюговий код? Можливо, щось із 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 подобниity.shtml ), де називаються ваші "контури". "багатокутник", читаючи такі речі, як:

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

і

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

і закінчується "Ієрархічним розпізнаванням в режимі реального часу об'єднаних об'єктів у зображеннях" Маркуса Ульріха, який співпрацює з MVTec , іншим програмним домом, що продає програмні засоби розпізнавання об'єктів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.