6

Mam obecnie do czynienia z moim zdaniem raczej powszechnym problemem, który powinien być dość łatwy do rozwiązania, ale jak dotąd wszystkie moje podejścia się nie powiodły, dlatego zwracam się do Ciebie o pomoc.Podejście polegające na dopasowywaniu kształtów/wzorów w Computer Vision

Myślę, że problem najlepiej wyjaśnić na niektórych ilustracjach. Mam kilka wzorów jak te dwa:

Pattern 1 Pattern 3

ja również mieć obraz jak (prawdopodobnie lepsze, ponieważ zdjęcie ten pochodzi z była dość słabo oświetlony) to:

Picture

(Należy pamiętać, że szablon został przeskalowany, aby zmieścić rozmiar obrazu)

Ostatecznym celem jest narzędzie określające, czy użytkownik pokazuje gest kciuka do góry/kciuk, a także kilka kątów pomiędzy. Dlatego chcę dopasować wzory do obrazu i zobaczyć, który z nich najbardziej przypomina obraz (a dokładniej kąt, jaki pokazuje ręka). Znam kierunek, w którym kciuk pokazuje wzór, więc jeśli znajdę wzór, który wygląda identycznie, mam również kąt.

Pracuję z OpenCV (z powiązaniami w Pythonie) i już wypróbowałem cvMatchTemplate i MatchShapes, ale jak dotąd nie działa to niezawodnie.

Mogę się tylko domyślać, dlaczego MatchTemplate się nie udało, ale myślę, że mniejszy wzór z mniejszą bielą pasuje do białego obszaru zdjęcia, tworząc tym samym najlepszy czynnik dopasowania, chociaż oczywiste jest, że nie wyglądają tak samo.

Czy istnieje kilka metod ukrytych w OpenCV, których jeszcze nie znalazłem lub czy istnieje znany algorytm dla tego typu problemów, które powinienem uzupełnić?

Szczęśliwego Nowego Roku.

Odpowiedz

6

Kilka prostych technik może pracować:

  1. Po binaryzacji i segmentacji, znaleźć średnicę Feret z dnia blob (a.k.a. najdalszej odległości między punktami, lub osi głównej).
  2. Znajdź wypukły kadłub zestawu punktów, wypełnij go wodą i traktuj jako połączony region. Odejmij oryginalny obraz kciukiem. Różnica polega na odległości pomiędzy kciukiem a pięścią, a położenie tego obszaru względem środka masy powinno dać wskazanie obrotu.
  3. Użyj algorytmu wodnego na odległościach od każdego punktu do krawędzi kropli. Może to pomóc w zidentyfikowaniu połączonego cienkiego obszaru (kciuka).
  4. Dopasuj największe kółko (lub największy wpisany wielokąt) wewnątrz obiektu. Rozłóż ten okrąg lub wielokąt, aż część jego krawędzi zachodzi na tło. Odejmij tę rozszerzoną figurkę od oryginalnego obrazu; tylko kciuk pozostanie.
  5. Jeśli wielkość dłoni jest spójna (lub względnie spójna), możesz również wykonać operacje morfologicznego N, aż kciuk zniknie, a następnie N rozszerzyć operacje, aby powiększyć pięść do pierwotnego przybliżonego rozmiaru. Odejmij ten blot-only blob od oryginalnego bloba, aby uzyskać kleks. Następnie wykorzystuje kierunek kleksów (średnica Fereta) i/lub środek masy względem środka masy bryły pięści, aby określić kierunek.

Techniki znajdowania punktów krytycznych (regionów silnej zmiany kierunku) są trudniejsze. W najprostszym przypadku możesz również użyć detektorów narożnych, a następnie sprawdzić odległość od jednego rogu do drugiego, aby zidentyfikować miejsce, w którym wewnętrzna krawędź kciuka styka się z pięścią.

Aby uzyskać bardziej złożone metody, zajrzyj do artykułów dotyczących dekompozycji kształtu autorstwa takich autorów, jak Kimia, Siddiqi i Xiaofing Mi.

1

MatchTemplate wydaje się być dobrym rozwiązaniem problemu, który opisujesz. W jaki sposób zawodzi? Jeśli faktycznie maskujesz znaki typu "kciuk w górę"/"kciuk w dół" lub "kciuk w dół" tak samo dobrze, jak pokazano na przykładowym obrazie, to wykonałeś już najtrudniejszą część.

MatchTemplate nie zawiera rotacji i skalowania w przestrzeni wyszukiwania, więc powinieneś generować więcej szablonów z obrazu referencyjnego na wszystkich obrotach, które chciałbyś wykryć, i powinieneś skalować szablony tak, aby pasowały do ​​ogólnego rozmiaru znalezionych kciuk w górę/kciuk w dół znaki.

[edytuj] Tablica wyników dla MatchTemplate zawiera wartość całkowitą, która określa, jak dobrze pasuje szablon do obrazu w tej lokalizacji. Jeśli używasz CV_TM_SQDIFF, to najniższą wartością w tablicy wyników jest lokalizacja najlepszego dopasowania, jeśli używasz CV_TM_CCORR lub CV_TM_CCOEFF, to jest to najwyższa wartość. Jeśli skalowane i obrócone obrazy szablonów mają taką samą liczbę białych pikseli, można porównać wartość najlepszego dopasowania, jaką można znaleźć dla wszystkich różnych obrazów szablonów, a najlepiej dopasowany obraz szablonu jest tym, który chcesz wybrać.

Istnieje wiele niezależnych funkcji wykrywania rotacji/skalowania, które mogą pomóc, ale normalizacja problemu do pracy z MatchTemplate jest zdecydowanie najłatwiejsza.

dla bardziej zaawansowanych rzeczy, sprawdź SIFT, Haar feature based classifiers lub one of the others available in OpenCV

+0

Tak, dostarczone obrazy są oryginalnymi obrazami. jest tak, że na przykład drugi obraz wzoru nie ma najlepszej pasującej wartości w porównaniu z obrazem próbki. nawet gdy mają prawie taki sam rozmiar jak na zdjęciu. czy polecasz specjalną metodę matchtemplate (CV_TM_SQDIFF, ...)? jaka jest wartość, którą otrzymuję? błąd dla całego obrazu? odległość na piksel (tak, że muszę podzielić go przez rozmiar obrazu lub coś podobnego?) – Nicolas

+0

Zaktualizowałem swoją odpowiedź, aby odpowiedzieć na twoje pytania. –

+0

Aby uzyskać "rozciągliwy" kształt, taki jak pięść, szablony dopasowań mogą nie zawsze działać tak dobrze, jak chcesz. Transformacje rotacyjne, skalujące i afiniczne razem nie uwzględniają rotacji i rozciągania pojedynczych elementów. Jeśli kombinacja technik morfologicznych i segmentacji nie działa, należy rozważyć poszukiwanie artykułów na temat "dekompozycji kształtu". – Rethunk

1

Myślę, że można uzyskać doskonałe wyniki, jeśli tylko obliczyć dwa punkty, które mają najdalej najkrótszą drogę przechodzi biały. Kierunek, w którym wskazuje kciuk, jest po prostu kierunkiem linii łączącej dwa punkty.

Możesz to łatwo zrobić, pobierając punkty na białym obszarze i używając numeru Floyd-Warshall.

+0

To brzmi interesująco, ale czy mógłbyś dalej rozwinąć? Nie rozumiem, co masz na myśli przez "punkty próbkowania na białym obszarze" i jak można użyć takiego algorytmu do wykresów, aby rozwiązać nasz problem. – Nicolas

+1

Zobacz ten artykuł, który dobrze opisuje technikę: "Klasyfikacja kształtu za pomocą wewnętrznego -Distance "autorstwa Ling and Jacobs www.cs.umd.edu/~djacobs/pubs_files/ID-pami-8.pdf – Rethunk