2011-10-14 11 views
6

Używam aplikacji kinect przy użyciu oficjalnego zestawu SDK Kinect.Analiza gestów Kinect

Wynik Chcę 1) w stanie zidentyfikować ciało machał przez 5 sek. Zrób coś, jeśli to zrobi, 2) rozpoznając pochylenie jedną nogą przez 5sek. zrób coś, jeśli to zrobi.

Ktoś wie, jak to zrobić? Robię w aplikacji WPF.

Chciałbym mieć przykład. Jestem nowy w Kinect.

Z góry dziękuję za wszelką pomoc!

Odpowiedz

17

Kinect zapewnia szkielety, które śledzi, resztę trzeba wykonać. Zasadniczo musisz utworzyć definicję dla każdego gestu, który chcesz, i uruchamiać go na szkieletach za każdym razem, gdy uruchamiane jest zdarzenie SkeletonFrameReady. To nie jest łatwe.

Definiowanie Gesty

Definiowanie gesty mogą być zaskakująco trudne. Najprostsze (najłatwiejsze) gesty to te, które zdarzają się w jednym momencie, a więc nie polegają na poprzednich miejscach kończyn. Na przykład, jeśli chcesz wykryć, kiedy użytkownik podnosi rękę nad głową, można to sprawdzić na każdej pojedynczej klatce. Bardziej skomplikowane gesty muszą uwzględniać pewien okres czasu. W przypadku gestu machania nie będziesz w stanie stwierdzić z jednej klatki, czy dana osoba macha, czy po prostu trzyma rękę przed nimi.

Teraz musisz mieć możliwość przechowywania istotnych informacji z przeszłości, ale jakie informacje są istotne? Czy zachować sklep z ostatnich 30 klatek i uruchomić algorytm przeciwko temu? 30 klatek daje ci tylko sekundę informacji. Może 60 klatek? A może przez 5 sekund, 300 klatek? Ludzie nie poruszają się tak szybko, więc może moglibyście użyć co piątej klatki, która przywróciłaby 5 sekund z powrotem do 60 klatek. Lepszym pomysłem byłoby wybranie i wybranie odpowiednich informacji poza ramkami. Dla gestu machania aktualna prędkość ręki, jak długo się porusza, jak daleko się porusza itd., Może być użyteczną informacją.

Po ustaleniu, jak zdobyć i zapisać wszystkie informacje dotyczące gestu, w jaki sposób przekształcić te liczby w definicję? Falowanie może wymagać pewnej minimalnej prędkości lub kierunku (w lewo/w prawo zamiast w górę/w dół) lub czasu trwania. Jednak ten czas trwania nie jest pięciosekundowy, który Cię interesuje. Ten czas trwania jest absolutnym minimum wymaganym do założenia, że ​​użytkownik macha. Jak wspomniano powyżej, nie można określić fali z jednej ramki. Nie powinieneś określać fali od 2, 3 lub 5, ponieważ to po prostu za mało czasu. Jeśli moja dłoń drgnie przez ułamek sekundy, czy uważasz, że fala? Prawdopodobnie jest to słodkie miejsce, w którym większość ludzi zgodziłaby się, że ruch od lewej do prawej stanowi falę, ale na pewno nie znam go na tyle dobrze, by zdefiniować go w algorytmie.

Jest inny problem z wymaganiem od użytkownika wykonania określonego gestu przez pewien okres czasu. Możliwe, że nie każda klatka w ciągu tych pięciu sekund okaże się falą, niezależnie od tego, jak dobrze zapiszesz definicję. Gdzie można łatwo ustalić, czy ktoś trzymał rękę nad głową przez pięć sekund (ponieważ można to ustalić na podstawie jednej klatki), o wiele trudniej jest to zrobić dla skomplikowanych gestów. I chociaż machanie nie jest tak skomplikowane, to nadal pokazuje ten problem. Gdy twoja ręka zmienia kierunek po obu stronach fali, przestaje się poruszać na ułamek sekundy. Czy nadal machasz? Jeśli odpowiedź brzmi "tak", machnij wolniej, aby zatrzymać się nieco bardziej po obu stronach. Czy ta przerwa nadal będzie uważana za falę? Prawdopodobnie w pewnym momencie tego pięciosekundowego gestu definicja nie wykryje fali.Więc teraz musisz wziąć pod uwagę pobłażliwość na czas trwania gestu. Jeśli gest machnięcia pojawił się w 95% z ostatnich pięciu sekund, czy to wystarczy? 90%? 80%?

Chodzi mi o to, że nie ma łatwego sposobu na rozpoznawanie gestów. Trzeba przemyśleć ten gest i określić jakąś definicję, która zmieni grono wspólnych pozycji (danych szkieletu) w gest. Będziesz musiał śledzić odpowiednie dane z poprzednich ramek, ale zdaj sobie sprawę, że definicja gestu prawdopodobnie nie będzie idealna.

Rozważmy Użytkownicy

Więc teraz, że mówiłem dlaczego pięć druga fala byłaby trudna do wykrycia, pozwól mi przynajmniej dać moje myśli o tym, jak to zrobić: nie. Nie powinieneś zmuszać użytkowników do powtarzania gestu opartego na ruchu przez określony czas (pięciosekundowa fala). Jest to zaskakująco męczące i po prostu nie to, czego ludzie oczekują/chcą od komputerów. Wskazywanie i klikanie jest natychmiastowe; jak tylko klikniemy, oczekujemy odpowiedzi. Nikt nie chce przytrzymywać kliknięcia przez pięć sekund, zanim będzie mógł otworzyć Saper. Powtarzanie gestu przez pewien czas jest w porządku, jeśli ciągle wykonuje jakieś działanie, na przykład za pomocą gestu, aby przejść przez listę - użytkownik zrozumie, że musi kontynuować gest, aby przejść dalej na liście. W ten sposób gest jest łatwiejszy do wykrycia, ponieważ zamiast potrzebować informacji przez ostatnie 5 sekund, wystarczy mieć wystarczającą ilość informacji, aby wiedzieć, czy użytkownik wykonuje teraz ten gest.

Jeśli chcesz, aby użytkownik trzymał gest przez określoną ilość czasu, ustaw go jako nieruchomy gest (trzymanie ręki w wybranej pozycji przez x sekund jest o wiele łatwiejsze niż machanie). Dobrym pomysłem jest również przekazanie wizualnej informacji zwrotnej, aby powiedzieć, że timer się zaczął. Jeśli użytkownik wkręci gest (niewłaściwa ręka, niewłaściwe miejsce itp.) I znajdzie się tam przez 5 lub 10 sekund, czekając, aż coś się stanie, nie będą zadowoleni, ale to nie jest część tego pytania.

Począwszy Kinect gestów

Start małe .. naprawdę małe. Najpierw upewnij się, że znasz swoją klasę SkeletonData. Na każdym szkielecie znajduje się 20 przegubów, a każdy z nich ma status TrackingState. Ten stan śledzenia pokaże, czy czujnik Kinect może rzeczywiście zobaczyć połączenie (śledzone), czy jest to ustalenie pozycji stawu w oparciu o resztę szkieletu (wywnioskowane), czy też całkowicie przestał próbować znaleźć połączenie (NotTracked) . Stany te są ważne. Nie chcesz myśleć, że użytkownik stoi na jednej nodze tylko dlatego, że Kinect nie widzi drugiej nogi i zgłasza dla niej fałszywą pozycję. Każdy staw ma pozycję, dzięki czemu wiesz, gdzie stoi użytkownik ... kawałek po kawałku. Zapoznaj się z układem współrzędnych.

Po zapoznaniu się z podstawami zgłaszania danych szkieletu spróbuj wykonać kilka prostych gestów. Wydrukuj wiadomość na ekranie, gdy użytkownik podnosi rękę nad głową. Wymaga to jedynie porównania każdej ręki ze stawem Głowy i sprawdzenia, czy którakolwiek dłoń jest wyższa od głowy w płaszczyźnie współrzędnych. Kiedy już to zrobisz, przejdź do czegoś bardziej skomplikowanego. Sugerowałbym próbę przesuwania palca (ręka przed ciałem, porusza się od prawej do lewej lub od lewej do prawej, minimalna odległość). Wymaga to informacji z poprzednich ramek, więc musisz przemyśleć, jakie informacje przechowywać. Jeśli możesz sprawić, że to działa, możesz spróbować przeciągnąć serię przesuwających się gestów w krótkim czasie i interpretować to jako falę.

tl; dr: Gesty są trudne. Zacznij mały, rozbuduj swoją pozycję. Nie zmuszaj użytkowników do powtarzania ruchów dla jednej czynności, jest męcząca i denerwująca. Dołącz wizualną informację zwrotną dla gestów opartych na czasie trwania. Przeczytaj resztę tego postu.

+0

Dzięki za radę! =) – user981924

3

Zestaw SDK Kinect pomaga uzyskać współrzędne różnych połączeń.Gest jest niczym innym, jak zmianą położenia zestawu stawów w pewnym okresie czasu.

Aby rozpoznawać gesty, należy przechowywać współrzędne przez pewien okres czasu i powtarzać je, aby sprawdzić, czy przestrzega ono reguł dla określonego gestu (np. - prawa ręka zawsze przesuwa się w górę).

Aby uzyskać więcej informacji, zapoznaj się z mojego blogu na temat: http://tinyurl.com/89o7sf5