Outlaw Lemur ha descritto dettagliatamente la maggior parte dei problemi che è possibile incontrare negli scenari del mondo reale.
Utilizzando Kinect per Windows versione 2, non è necessario regolare il motore, poiché non vi è alcun motore e il sensore ha un campo visivo più ampio. Questo renderà la tua vita molto più facile.
vorrei aggiungere le seguenti suggerimenti e consigli:
1) Evitare la luce diretta (fisico o illuminazione interna)
Kinect ha un sensore a infrarossi che potrebbe essere confuso. Questo sensore non dovrebbe avere contatto diretto con alcuna fonte di luce. Puoi emulare un tale ambiente a casa tua/ufficio giocando con un normale puntatore laser e torce.
2) Se si sta seguendo una sola persona, selezionare l'utente cingolato più vicino
Se la tua applicazione necessita di un solo giocatore, quel giocatore deve essere a) completamente monitorato e b) più vicino al sensore di gli altri. È un modo semplice per far capire ai partecipanti chi viene tracciato senza rendere più complessa la tua interfaccia utente.
public static Body Default(this IEnumerable<Body> bodies)
{
Body result = null;
double closestBodyDistance = double.MaxValue;
foreach (var body in bodies)
{
if (body.IsTracked)
{
var position = body.Joints[JointType.SpineBase].Position;
var distance = position.Length();
if (result == null || distance < closestBodyDistance)
{
result = body;
closestBodyDistance = distance;
}
}
}
return result;
}
3) Utilizzare gli ID di monitoraggio per distinguere i diversi giocatori
Ogni giocatore ha una proprietà TrackingID. Usa quella proprietà quando i giocatori interferiscono o si muovono in posizioni casuali. Non usare questa proprietà come alternativa al riconoscimento facciale.
ulong _trackinfID1 = 0;
ulong _trackingID2 = 0;
void BodyReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
using (var frame = e.FrameReference.AcquireFrame())
{
if (frame != null)
{
frame.GetAndRefreshBodyData(_bodies);
var bodies = _bodies.Where(b => b.IsTracked).ToList();
if (bodies != null && bodies.Count >= 2 && _trackinfID1 == 0 && _trackingID2 == 0)
{
_trackinfID1 = bodies[0].TrackingId;
_trackingID2 = bodies[1].TrackingId;
// Alternatively, specidy body1 and body2 according to their distance from the sensor.
}
Body first = bodies.Where(b => b.TrackingId == _trackinfID1).FirstOrDefault();
Body second = bodies.Where(b => b.TrackingId == _trackingID2).FirstOrDefault();
if (first != null)
{
// Do something...
}
if (second != null)
{
// Do something...
}
}
}
}
4) avvertimenti di visualizzazione quando un giocatore è troppo lontano o troppo vicino al sensore.
Per ottenere una maggiore precisione, i giocatori devono stare a una distanza specifica: non troppo lontano o troppo vicino al sensore. Ecco come controllare questo:
const double MIN_DISTANCE = 1.0; // in meters
const double MAX_DISTANCE = 4.0; // in meters
double distance = body.Joints[JointType.SpineBase].Position.Z; // in meters, too
if (distance > MAX_DISTANCE)
{
// Prompt the player to move closer.
}
else if (distance < MIN_DISTANCE)
{
// Prompt the player to move farther.
}
else
{
// Player is in the right distance.
}
5) sanno sempre quando un giocatore è entrato o uscito di scena.
Vitruvius fornisce un modo semplice per capire quando qualcuno è entrato o ha lasciato la scena.
Here is the source code e qui è come utilizzarlo nella vostra applicazione:
UsersController userReporter = new UsersController();
userReporter.BodyEntered += UserReporter_BodyEntered;
userReporter.BodyLeft += UserReporter_BodyLeft;
userReporter.Start();
void UserReporter_BodyEntered(object sender, UsersControllerEventArgs e)
{
// A new user has entered the scene. Get the ID from e param.
}
void UserReporter_BodyLeft(object sender, UsersControllerEventArgs e)
{
// A user has left the scene. Get the ID from e param.
}
6) Avere un indizio visivo di quale giocatore è monitorato
Se ci sono un sacco di persone che circondano il giocatore , potrebbe essere necessario mostrare sullo schermo chi è monitorato. È possibile evidenziare la bitmap del frame di profondità o utilizzare le interazioni Kinect di Microsoft.
This is an example of removing the background and keeping the player pixels only.
7) Evitare pavimenti lucidi
alcuni piani (brillante, lucido) possono rispecchiare le persone e Kinect possono confondere alcune delle loro articolazioni (per esempio, Kinect può estendere le gambe al corpo riflessa). Se non è possibile evitare i pavimenti lucidi, utilizzare la proprietà FloorClipPlane di BodyFrame. Tuttavia, la soluzione migliore sarebbe quella di avere un semplice tappeto dove ci si aspetta che le persone stiano in piedi. Un tappeto fungerà anche da indicazione della giusta distanza, in modo da fornire un'esperienza utente migliore.
Non ho ricevuto la seconda domanda. – GLHF
@howaboutNO è il rumore di fondo puramente un problema hardware? O c'è qualcosa che può essere fatto a livello di codice? L'SDK non consente un tracciamento migliore? –