Dopasowywanie konturów - znajdowanie przesunięcia konturów


17

Znalazłem kontury na dwóch obrazach z tym samym obiektem i chcę znaleźć przemieszczenie i obrót tego obiektu. Próbowałem z obróconymi ramkami ograniczającymi tych konturów, a następnie z ich kątami i punktami środkowymi, ale obroty ramek ograniczających nie mówią poprawnie o obrocie konturu, ponieważ są takie same dla kątów a + 0, a + 90, a + 180 itd. stopnie. Czy jest to inny dobry sposób na znalezienie obrotu i przesunięcia konturów? Może jakieś zastosowanie wypukłego kadłuba, wad wypukłych? Czytałem w Learning OpenCv o dopasowywaniu konturów, ale to nie pomogło. Czy ktoś mógłby podać jakiś przykład?

Przykłady:

1 2) 3) 4

Chcę wykryć na przykład różowy kwadrat, aw drugim przypadku długopis. Innymi przykładami mogą być kwadraty z pewnymi dziurami, gwiazdami itp. Jak powiedziałem, chcę zrobić coś uniwersalnego. Wszelkie sugestie są mile widziane, ponieważ chcę przetestować jak najwięcej metod.


Pomoże tu zdjęcie
— mirror2image 24.11.11

Chcę zrobić jakąś uniwersalną funkcję. Tak jak obraz testowy może być czymkolwiek. Prosty element w kształcie prostokąta lub nieco bardziej złożony kształt.
— krzych 25.11.11

2
Nie możesz dopasować jednej metody do wszystkich przypadków. Praktyczna metoda zależy od zasięgu kontrastu, oceny szumów, tła i samego kształtu - jego gładkości, topologii itp. Dlatego właśnie obraz miałby pomóc.
— mirror2image 25.11.11

Odpowiedzi:


4

Czy musisz się martwić różnicą skali między konturami? Jeśli nie, możesz po prostu znaleźć środek ciężkości każdego konturu i obliczyć przemieszczenie, odejmując jeden od drugiego. Następnie możesz obliczyć główne osie konturów i znaleźć kąt obrotu między nimi.

W przypadku skalowania można obliczyć współczynnik skali, biorąc stosunek odpowiednich osi głównych.


Skala tak może się również różnić. Myślałem również o czymś podobnym do łańcuchów Freemana z opencv, tworząc łańcuchy Freemana dla każdego konturu, a następnie porównując je i próbując znaleźć jakiś translaton, ale nie mogę znaleźć dobrego algorytmu dla tego.
— krzych 23.11.11

To samo, co tworzenie minimalnego obróconego obwiedni i przyjmowanie jego obrotu i przemieszczenia. Wypróbowałem to podejście, a wyniki są niezadowalające. Myślę więc, że ta metoda wcale nie jest dobra.
— krzych 24.11.11

Czy możesz sprecyzować, dlaczego to nie zadziałało? Czy kontury są powiązane tylko przez translację, obrót i skalowanie, czy mogą być zdeformowane w inny sposób? Niektóre zdjęcia naprawdę by pomogły. Jeśli potrzebujesz poradzić sobie z transformacjami nie-afinicznymi lub przypadkowym szumem, możesz spróbować kontekstu kształtu. Daj mi znać, mogę wskazać kilka dokumentów.
— Dima,

Są one powiązane tylko z translacją, obrotem i skalowaniem, deformacje są powiązane z niewielkim różnym wykrywaniem konturu na różnych zdjęciach. Kontekst kształtu? Czy możesz to rozwinąć?
— krzych 26.11.11

1
@ kzych Wygląda na to, że Twoim największym problemem jest szum w wykrywaniu krawędzi. Jak znaleźć minimalną obróconą skrzynkę? Nadal nie jestem jasne, dlaczego to nie działa dobrze. Kontekst kształtu jest sposobem przedstawienia konturu. Szczegóły są tutaj: en.wikipedia.org/wiki/Shape_context
— Dima

2

Jeśli nie musisz się martwić skalą lub zniekształceniami projekcyjnymi, pomocne mogą być tutaj kody łańcuchowe. Jeśli masz kody łańcuchowe o mniej więcej tym samym kształcie i tej samej skali, możesz znaleźć tłumaczenie z jednowymiarową korelacją fazową FFT http://en.wikipedia.org/wiki/Phase_correlation

Jeśli musisz wziąć pod uwagę zniekształcenie rzutowe, możesz również rozważyć możliwość użycia punktów charakterystycznych (takich jak narożniki) zamiast konturów.


Wszelkie porady, jak zbudować dobry kod łańcucha? Mayby coś z OpenCv (o ile wiem, ma tylko łańcuchy Freemana)? Na razie buduję kody łańcuchowe, używając każdego punktu konturu i obliczając kąt do osi x punktów sąsiadów, ale może jest jakiś lepszy pomysł? Jeśli masz odniesienie do dobrych artykułów na temat łańcuchów, będzie to mile widziane.
— krzych 28.11.11

2

W pytaniu, które mówisz

Jak powiedziałem, chcę zrobić coś uniwersalnego

ale obawiam się, że dość trudno jest znaleźć „uniwersalne” rozwiązanie problemu.

Możesz kupić dostępne na rynku oprogramowanie do lokalizowania wzorców i zintegrować je z aplikacją, zwykle działają one całkiem dobrze w szerokim zakresie aplikacji. Aby dać ci wyobrażenie, jest to podręcznik referencyjny dla takiego produktu http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

Możesz także opracować rozwiązanie ad hoc dla konkretnego przypadku (na przykład dla długopisu na obrazie).

W przeciwnym razie możesz dokładnie przestudiować problem, zaczynając od bardzo podstawowych podstaw zakorzenionych w geometrii obliczeniowej ( http://www.cs.sunysb.edu/~alameter/files/shape-similarity.shtml ), gdzie nazywane są „kontury” „wielokąt”, czytanie takich rzeczy jak:

M. de Berg, O. Devillers, M. Kreveld, O. Schwarzkopf i M. Teillaud. Obliczanie maksymalnego nakładania się dwóch wypukłych wielokątów w tłumaczeniach. Theoretical Computer Science, 31: 613–628, 1998.

i

H. Ahn, O. Cheong, C. Park, C. Shin i A. Vigneron. Maksymalizacja nakładania się dwóch płaskich zestawów wypukłych pod sztywnymi ruchami. Geometria obliczeniowa: teoria i zastosowania, 37: 3–15, 2007.

i kończąc na „Hierarchicznym rozpoznawaniu w czasie rzeczywistym złożonych obiektów w obrazach ” Markusa Ulricha, który współpracuje z MVTec , innym domem oprogramowania sprzedającym narzędzia do rozpoznawania obiektów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.