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.

krzych
źródło
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.

Dima
źródło
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.

mirror2image
źródło
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.

Alessandro Jacopson
źródło