2013-05-06 17 views
7

Próbuję znaleźć trzy kąty twarzy osoby, na podstawie obrazu 2D 2D image.Szacowanie pozycji głowy za pomocą OpenCV, C++ i obrazu 2D - Metoda geometryczna - Roll, Yaw i Pitch

Używam OpenCV z HaarCascade, aby znaleźć twarz, oczy, nos i usta. Ale nie znalazłem żadnej geometrycznej metody, która pomogłaby mi znaleźć kąty X, Y i Z (Roll, Pitch i Yaw).

Czy ktoś może mi pomóc, pokazując jakąś metodę w języku C++ lub java, która działa?

+0

to nie jest C++ pytanie więc usunąłem ten tag. –

Odpowiedz

5

Biorąc pod uwagę jeden obraz i brak innych informacji, nie ma jednego rozwiązania dla kątów. Rozważmy przypadek właśnie Yaw. Rzutowany na płaszczyznę 2d, jest widoczny jako mała zmiana w odległości między oczami i umiejscowieniu oczu w stosunku do nosa/ust. Jednak odległość ta nie jest stała między poszczególnymi osobami.

Jednym z typowych sposobów jest wymóg, aby użytkownik "skalibrował" swoją twarz, patrząc bezpośrednio w kamerę pod kątem nominalnym "0". W tym momencie masz teraz długości referencyjne, dzięki którym możesz porównywać kolejne obrazy.

Długość nadal nie jest wystarczającą informacją, jednak ilość widocznych rzutowanych odległości zależy od optyki i odległości ściany od aparatu. Optyka, którą zwykle konfigurujesz ręcznie; odległość, którą można oszacować, przyjmując "przeciętne" wymiary twarzy i zakładając, że "nominalny" obraz idealnie pasuje do tych wymiarów. Możesz to zmienić, jeśli okaże się, że jest on zbyt lub niedoszacowanie obrotów dla konkretnej twarzy.

Gdy już wszystkie te założenia są spełnione, jest to dość prosta geometria. Możesz oszacować przechylenie z linii od oczu przez nos do ust. Możesz zmierzyć odległość między oczami, aby oszacować odchylenie. Na koniec można oszacować wysokość dźwięku za pomocą odstępu między oczami/ustami lub oczami/nosem. Pamiętaj, że te założenia działają najlepiej, gdy twarz jest nadal dość zbliżona do nominalnej.

+0

Ale chciałbym poznać jakąś metodę w C++, aby to zrobić. –

0

Chcemy więc znaleźć orientację (w kątach RPY) twarzy w oparciu o pozycję nosa, oczu i ust. Zakładając, że wszystkie trzy (cztery - dwa oczy) są widoczne, użyłbym symetrycznych cech twarzy do określenia orientacji głowy, takich jak:

Linia między oczami może być używana jako odniesienie dla jednego z osie (na przykład skok). Następnie możemy założyć, że oś Roll wskazuje w kierunku nosa - co można zmierzyć poprzez przesunięcie położenia nosa do punktu środkowego między oczami. I na koniec, Yaw można zmierzyć poprzez relację odległości między punktem środkowym między oczami, pozycją nosa i położeniem ust.

Nie znam relacji odległości między czterema punktami zainteresowania i prawdopodobnie są one różne pod względem płci, wieku i pochodzenia. Jeśli jednak uda się znaleźć taką relację, wyprowadzenie kątów powinno być matematycznie proste.

Interesująca aplikacja przy okazji!

0

Jeśli używasz klasyfikatora kaskadowego do wykrycia prawego oka, lewego oka i nosa, obliczyć środek ciężkości każdej funkcji (funkcja x/2, funkcja y/2), otrzymasz trzy punkty x-y na obrazie.

Możesz wykryć przechylenie, patrząc na wartości Y każdego oka, jeśli jeden jest wyższy od drugiego, oznacza to, że głowa jest pochylona w kierunku najniższej wartości Y (gdy jedno oko przesuwa się w górę, drugie porusza się w dół)

Możesz wykryć zbaczanie, patrząc na wartość X nosa, jeśli użytkownik patrzy w lewo, wartość X ich nosa będzie bliżej wartości X lewego oka, i to samo z patrzeniem w prawo na prawe oczy X wartość.

Możesz wykryć wysokość dźwięku, patrząc na wartość Y nosa, jeśli użytkownik patrzy w górę, wartość Y będzie zbliżona do obu wartości Y oczu, a jeśli spojrzą w dół, wartość Y będzie dalej od wartość oka.

To oczywiście nie jest bardzo dokładne i nie podaje dokładnych kątów, jednak możesz użyć tych informacji, aby spróbować zaklasyfikować każdą wartość w ramach pewnych grup, tj. (Patrząc w przyszłość, patrząc w lewo, wyglądając na naprawdę po lewej)

Jedyne, co widzę, pozwalające wyliczyć wszystkie trzy w jednym obrazie, może być, jeśli rolka jest dość drastyczna, obliczanie odchylenia może być kłopotliwe, ponieważ oś X nie jest już płaska.

Można to rozwiązać, poprawiając obraz poprzez obrót 2D. Trzeba będzie znaleźć, ile potrzebuje obraz ma być obracany z

Value = (right eye Y/2) - (left eye Y/2) 

Dzięki tym informacjom można skorygować obraz i kontynuować przetwarzania (aby obrócić obraz spojrzeć w górę tworząc macierz obrotu 2D i korzystania warp afiniczne)

Przepraszam, jeśli jest trochę Necro, ale uważam, że powyższa metoda być całkiem udany i mam nadzieję, że to pomoże ktoś

Powiązane problemy