Il Kinect fornisce gli scheletri è di monitoraggio, è necessario fare il resto. Fondamentalmente è necessario creare una definizione per ogni gesto che si desidera ed eseguirlo contro gli scheletri ogni volta che viene attivato l'evento SkeletonFrameReady. Questo non è facile.
Definizione Gesti
Definire i gesti può essere sorprendentemente difficile. I gesti più semplici (più semplici) sono quelli che si verificano in un singolo punto nel tempo e, pertanto, non si basano su posizioni passate degli arti. Ad esempio, se si desidera rilevare quando l'utente ha la mano sollevata sopra la testa, è possibile verificarla su ogni singolo fotogramma. I gesti più complicati devono prendere in considerazione un periodo di tempo. Per il tuo gesto ondeggiante, non sarai in grado di distinguere da un singolo fotogramma se una persona sta salutando o semplicemente tenendo la mano di fronte a loro.
Così ora è necessario essere in grado di memorizzare le informazioni rilevanti dal passato, ma quali sono le informazioni è rilevante? Dovresti tenere un archivio degli ultimi 30 fotogrammi ed eseguire un algoritmo contro questo? 30 fotogrammi ti danno solo un secondo di informazioni ... forse 60 fotogrammi? O per i tuoi 5 secondi, 300 fotogrammi? Gli umani non si muovono così velocemente, quindi forse potresti usare ogni quinto fotogramma, il che ridurrebbe i tuoi 5 secondi a 60 fotogrammi. Un'idea migliore sarebbe quella di scegliere le informazioni rilevanti dai frame. Per un gesto ondeggiante, la velocità attuale della mano, quanto è stato spostato, quanto è lontano, ecc. Potrebbero essere tutte informazioni utili.
Dopo aver capito come ottenere e memorizzare tutte le informazioni relative al tuo gesto, come si fa a trasformare quei numeri in una definizione? L'ondulazione potrebbe richiedere una certa velocità minima o una direzione (sinistra/destra anziché su/giù) o una durata. Tuttavia, questa durata non è la durata di 5 secondi a cui sei interessato. Questa durata è il minimo assoluto richiesto per presupporre che l'utente stia salutando. Come accennato in precedenza, non è possibile determinare un'onda da un fotogramma. Non dovresti determinare un'onda da 2, 3 o 5, perché non è abbastanza tempo. Se la mia mano si contrae per una frazione di secondo, considereresti un'onda? Probabilmente c'è un punto in cui la maggior parte delle persone concorda sul fatto che un movimento da sinistra a destra costituisce un'onda, ma io certamente non lo conosco abbastanza bene da definirlo in un algoritmo.
C'è un altro problema con che l'utente debba fare un certo gesto per un periodo di tempo. È probabile che non tutti i fotogrammi in quei cinque secondi sembrino un'onda, indipendentemente da quanto bene scrivi la definizione. Dove puoi facilmente determinare se qualcuno ha tenuto la propria mano sulla testa per cinque secondi (perché può essere determinata su una base singola), è molto più difficile farlo per gesti complicati. E mentre ondeggiare non è così complicato, mostra ancora questo problema. Quando la tua mano cambia direzione su entrambi i lati di un'onda, smette di muoversi per una frazione di secondo. Allora stai ancora salutando? Se hai risposto di sì, saluta più lentamente, quindi ti fermi un po 'di più su entrambi i lati. Questa pausa sarebbe ancora considerata un'onda? È probabile che, ad un certo punto in quel gesto di cinque secondi, la definizione non riesca a rilevare un'onda.Quindi ora devi tener conto di una clemenza per la durata del gesto .. se il gesto ondeggiante si è verificato per il 95% degli ultimi cinque secondi, è abbastanza buono? 90%? 80%?
Il punto che sto cercando di fare qui è che non esiste un modo semplice per eseguire il riconoscimento dei gesti. Devi pensare attraverso il gesto e determinare una sorta di definizione che trasformerà un gruppo di posizioni congiunte (i dati dello scheletro) in un gesto. Dovrai tenere traccia dei dati rilevanti dai fotogrammi precedenti, ma rendersi conto che la definizione del gesto probabilmente non sarà perfetta.
consideri gli Utenti
Quindi, ora che ho detto perché i cinque seconda ondata sarebbe difficile da rilevare, mi permettono di dare almeno i miei pensieri su come farlo: non lo fanno. Non dovresti costringere gli utenti a ripetere un gesto basato sul movimento per un determinato periodo di tempo (i cinque secondi). È sorprendentemente stancante e non è quello che le persone si aspettano/vogliono dai computer. Punta e clicca è istantaneo; non appena clicchiamo, ci aspettiamo una risposta. Nessuno vuole tenere premuto un clic per cinque secondi prima di poter aprire il Campo minato. Ripetendo un gesto per un periodo di tempo va bene se esegue continuamente un'azione, come usare un gesto per scorrere un elenco: l'utente capirà che deve continuare a fare il gesto per spostarsi più avanti nell'elenco. Ciò rende anche più facile rilevare il gesto, perché invece di avere bisogno di informazioni per gli ultimi 5 secondi, hai solo bisogno di informazioni sufficienti per sapere se l'utente sta facendo il gesto in questo momento.
Se si desidera che l'utente mantenga un gesto per un determinato periodo di tempo, renderlo un gesto stazionario (tenere la mano in una posizione per x secondi è molto più facile che agitare). È anche una buona idea dare un feedback visivo, per dire che il timer è iniziato. Se un utente sbaglia il gesto (mano sbagliata, posto sbagliato, ecc.) E finisce lì per 5 o 10 secondi in attesa che qualcosa accada, non sarà felice, ma questo non fa realmente parte di questa domanda.
partire con Kinect gesti
Inizio piccola .. davvero piccola. Per prima cosa, assicurati di conoscere la classe SkeletonData. Ci sono 20 giunture tracciate su ogni scheletro e ognuna ha un TrackingState. Questo stato di tracciamento mostrerà se il Kinect può effettivamente vedere l'articolazione (Tracked), se sta calcolando la posizione del giunto in base al resto dello scheletro (Inferred), o se è completamente abbandonato cercando di trovare il giunto (NotTracked) . Questi stati sono importanti. Non vuoi pensare che l'utente sia in piedi su una gamba semplicemente perché il Kinect non vede l'altra gamba e sta segnalando una posizione fasulla per essa. Ogni articolazione ha una posizione, che è il modo in cui sai dove si trova l'utente .. pezzo per pezzo. Familiarizzare con il sistema di coordinate.
Dopo aver compreso le basi di come vengono riportati i dati dello scheletro, provare per alcuni semplici gesti. Stampa un messaggio sullo schermo quando l'utente alza una mano sopra la testa. Ciò richiede solo il confronto di ciascuna mano con la testa e vedere se una delle due mani è più alta della testa nel piano delle coordinate. Dopo averlo fatto funzionare, passare a qualcosa di più complicato. Suggerirei di provare un movimento a scorrimento (la mano davanti al corpo, si sposta da destra a sinistra o da sinistra a destra a una distanza minima). Ciò richiede informazioni dai frame precedenti, quindi dovrai pensare a quali informazioni memorizzare. Se riesci a farlo funzionare, potresti provare a stringere una serie di gesti a scorrimento in una piccola quantità di tempo e interpretarla come un'onda.
tl; dr: I gesti sono difficili. Inizia in piccolo, costruisci la strada. Non fare fare agli utenti movimenti ripetitivi per una singola azione, è stancante e fastidioso. Includere feedback visivi per i gesti basati sulla durata. Leggi il resto di questo post.
Grazie per il consiglio! =) – user981924