[Kinect] Détection de mouvement: création d'un squelette

Actares1456 Messages postés 41 Date d'inscription samedi 13 août 2011 Statut Membre Dernière intervention 21 mai 2012 - 17 août 2011 à 16:50
Actares1456 Messages postés 41 Date d'inscription samedi 13 août 2011 Statut Membre Dernière intervention 21 mai 2012 - 18 août 2011 à 15:23
Hello world!
Enfin finis, ou presque!
Voilà, il y a peu de temps, j'ai posé une question sur la fabriquation d'un détecteur de mouvement pour la webcam (genre Kinect). Depuis, je m'y suis donné à fond et y a des endroit ou je bloc et je sais que je dois mettre quelque'cose mais j'arrive pas à trouver quoi (étant Débutant, j'ai de la peine a écrire/trouver certain truc, surtout que c'est mon tous premier code!)

Donc ça serait vachement cool qu'on m'aide à terminer ce code! Merci d'avance



Voici trois code (les 2 premiers sont OK, enfait c'est "le plus long où y a des problèmes)
-------------------------------------------------------------------------
//programeur: Actares 1456 code 1-2-3
// on commence d'abord par demander "les flux ( squelette/...)"
// format "RGB" et "YUV"

// 10 bits pour la dist. en milimetre depuis la webcam et 3 bits pour reconnaître la personne
using Microsoft.Research.Webcam.Nui;
using Microsoft.Research.Webcam.Audio;

webcamRuninc = new Runtime();
webcamRuntime.Initialize(RunTimeOptions.useDepthAndPlayerIndex | RuntimeOptions.UseSkeletal | RuntimeOptions.Usecolor);

//////////////////////////////////////////////////////////////////////////////////////séparation 1//////////////////////////////////////////////////

// Début du code (avec ce que je peux faire) . Enfait je pensse utiliser "TrackingID" pour les mouvement du //perso
public class ColorStreamManager
{
public BitmapSource ColorBitmap { get; privat set; }

public void Update(ImageFrameReadyEventArgs e)
{
PlanarImage Image = e.ImageFrame.Images;

ColorBitmap = BitmapSource.Create(Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);
}
}
///////////////////////////////////////////////////////////////////////////////////////séparation 2//////////////////////////////////////////////

webcamRunTime.SkeletonEngine.TransformSmooth = true;

var parameters = new TransformSmoothParameters

{

Smoothing = 1.0f,
Correction = 0.1f,
Prediction = 0.1f,
JitterRadius = 0.05f,
MaxDeviousRadius = 0.05f,
};
webcamRuntime.SkeletonEngine.SmoothParameters = parameters;
///////////////////////////////////////////////////////////////////////////////////////séparation 3/////////////////////////////////////////////

// Début du code


using System.;
using System.Collections.Generic;
using System.linq;
using System.Speech.Reconition;
using System.text;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Image;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Research.Webcam.Audio;
using Microsoft.Research.Webcam.Nui;


namespace SkeletalViewer

{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>


{
public MainWindow()
{
InitializeComponent();
}

Runtime nui;
int totalFrames=0;
int lastFrames=0;
DateFime lastTime = DeteTime.MaxValue;

// controle de la profondeur/couleur et fabriquation d'un squelette basic

const int RED_IDX= 2;
const int GREEN_IDX= 1;
const int BLUE_IDX= 0;
byte[]depthFrame32 = new byte[320*240*4];

Dictionary <JointID, Brush> jointColors = new Dictionary <JointID, Brush>(){

{JointID.HipCenter,new SolidBrush(Color.FromRgb(169,175,155))},
{JointID.Spine,new SolidBrush(Color.FromRgb(169,175,155))},
{JointID.ShoulderCenter,new SolidBrush(Color.FromRgb(168,230,20))},
{JointID.Head,new SolidBrush(Color.FromRgb(200,0,0))},
{JointID.ShoulderLeft,new SolidBrush(Color.FromRgb(79,84,33))},
{JointID.ElbowLeft,new SolidBrush(Color.FromRgb(84,33,42))},
{JointID.WrisLeft,new SolidBrush(Color.FromRgb(255,126,0))},
{JointID.HandLeft,new SolidBrush(Color.FromRgb(215,86,0))},
{JointID.ShoulderRight,new SolidBrush(Color.FromRgb(33,79,84))},
{JointID.ElbowRight,new SolidBrush(Color.FromRgb(33,33,84))},
{JointID.WrisRight,new SolidBrush(Color.FromRgb(77,109,243))},
{JointID.HandRight,new SolidBrush(Color.FromRgb(37,69,243))},
{JointID.HipLeft,new SolidBrush(Color.FromRgb(77,109,243))},
{JointID.KneeLeft,new SolidBrush(Color.FromRgb(69,33,84))},
{JointID.AnkLeft,new SolidBrush(Color.FromRgb(229,170,122))},
{JointID.FootLeft,new SolidBrush(Color.FromRgb(255,126,0))},
{JointID.HipRight,new SolidBrush(Color.FromRgb(181,165,213))},
{JointID.KneeRight,new SolidBrush(Color.FromRgb(71,222,76))},
{JointID.AnkRight,new SolidBrush(Color.FromRgb(245,228,156))},
{JointID.FootRight,new SolidBrush(Color.FromRgb(77,109,243))}

};

static void source_BeamChanged(object sender,BeamChangedEventArgs e)
{
console.writeline("Angle :{0} radians", e.Angle);
}
private void Window_Loaded(object sender, EventArgs e)
{
nui = newRuntime();
try
{
nui.Initialize(RunTimeOptions.UseDepthAndPlayerIndex | RunTimeOptions.UseSkeletalTracking | RunTimeOptions.UseDepthParameters) // pas sur //"DepthParameters"
}
catch (InvalidOperationExeption)
{
System.Windows.MessageBox.Show("La connexion avec le RunTim a échoué, veuillez verifier la connexion avec votre webcam.")
return;
}
try
{
nui.VideoStream.Open(ImageStreamType.Video,2,ImageResolution640x480,ImageType.Color);
nui.DepthStream.Open(ImageStreamType.Video,2,ImageResolution,320x240ImageType.DepthPlayer);
}
catch (InvalidOperationExeption)
{
System.Windows.MessageBox.Show("la connexion Stream a échoué. Verifier que votre compatibilité")
return;
}
lastTime = DateTime.Now;

nui.DepthFrameReady+= new EventHandler(nui_DepthFrameReady);
nui.DepthFrameReady+= new EventHandler(nui_SkeletonFrameReady);
nui.DepthFrameReady+= new EventHandler(nui_ColorFrameReady);
}
void sre_SpeechRecognitionRejected(object sender,SpeechRecognitionRejectedEventArgs e)
{
consol.WriteLine("In Speech Rejected");
}

//////////////////////////////////////////////////////////////////////////
////// /////////
////// Il faut un rajout ici assez grand /////////
////// /////////
//////////////////////////////////////////////////////////////////////////
}
}
return depthFrame32;
}
void nui_DepthFrameReady(object sender,ImageFrameReadyEventArgs e)
{
PlanarImage Image= e.ImageFrame.Image;
byte[]convertedDepthframe 0 convertedDepthFrame(Image.Bits);
Depth.Source=BitmapSource.Create(Image.Width,Image.Height,96,96,PixelFormats.Bqr32,null,convertedDepthFrame,Image.Weidth*4);


++total Frames;
DateTime cur = DateTime.Now;
if (cur.Subtract(lastTime)> TimeSpan.FromSecond(1))
{
int frameDiff = DateTime.Now;
lastFrames = totalFrames;
lastTime = cur;
frameRate.Text = frameDiff.ToString() + "fps";
}
}
private Point getDisplayPosition((Joint joint)//(+)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// je dois mettre qqchose là.
Polyline getBodySegement(Microsoft.Research.Webcam.Nui.Joints Collection,joints,Brush brush,params JointID[] ids) // (+)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// je dois mettre qqchose là.
void nui_SkeletonFrameReady(object sender,SkeletonFrameReadyEventArgs e)
{
SkeletonFrame skeletonFrame = e.SkeletonFrame;
int iSkeleton = 0;

Brush[] brushes = new Brush[6];
brushes[0]= new SolidColorBrush(Color.FromRgb(255,0,0));
brushes[1]= new SolidColorBrush(Color.FromRgb(0,255,0));
brushes[2]= new SolidColorBrush(Color.FromRgb(64,255,255));
brushes[3]= new SolidColorBrush(Color.FromRgb(255,255,64));
brushes[4]= new SolidColorBrush(Color.FromRgb(255,64,255));
brushes[5]= new SolidColorBrush(Color.FromRgb(128,128,255));

skeleton.Children.Clear();
foreach (SkeletonData data in skeletonFrame.Skeletons)
{
if (SkeletonTrakingState.Traked == data.TrakingState)
{
Brush brush = brushes[iSkeleton % bruches.Length];
skeleton.Children.Add(getBodySegment(data.Joints,brush,JointID.HipCenter,JointID.Spine,JointID.Shape); // Il me maque peut-être qqchose
skeleton.Children.Add(getBodySegment(data.Joints,brush,JointID.ShoulderShoulderCenter,JointID.ShoulderLeft,JointID.);//Il me manque qqchose p't'être en Left
skeleton.Children.Add(getBodySegment(data.Joints,brush,JointID.ShoulderCenter,JointID.ShoulderRight,JointID.) //Il me manque qqchose (peut-être en"Right"
skeleton.Children.Add(getBodySegment(data.Joints,brush,JointID.HipCenter,JointID.HipLeft,JointID.); //Il me manque qqchose (peut-être finissant par "Left"
skeleton.Children.Add(getBodySegment(data.Joints,brush,JointIDHipCenter,JointID.HipRight,JointID.); //Il me manque qqchose (peut-être finissant par "Right"

foreach (joint joint in data.Joints)
{
Point jointPos = getDisplayPosition(joint);
Line jointLine = new Line();
jointLine.X1 = jointPos.X - 3;
jointLine.X2 = jointLine.X1 + 6;
jointLine.Y1 jointLine.Y2 jointPos.Y;
jointLine.Stroke = jointColors[joint.ID];
jointLine.StrokeThickness = 6;
skeleton.children.Add(jointLine);
}
iSkeleton ++;
}//
}
void nui_ColorFRameReady(object sender, ImageFrameReadyEventArgs e)

{
//32 bit par Pixel, RGBA image

planarImage Image= e.ImageFrame.Image;
video.Source =BitmapSource.Ccreate(
Image.Width,Image.Height,96,96,PixelFormat.Bgr32,null,Image-Bits,Image.Width*Image.BytesPerPixels)

}

private void Window_Closed(object sender, EventArgs e)
{
nui.Uninitialize();
Environement.Exit(0);
}
}
//////////////////////////////////////////////////////////////////////////
////// /////////
////// Il faut un rajout ici assez grand /////////
////// /////////
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
"Désolé pour la présentation j'ai pas pris en compte la teille de la boîte d'envoi" Excusez-moi

4 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
17 août 2011 à 16:59
Hello,
Tu aurais pu mettre ton code dans les balises adéquates afin d'avoir un formatage un peu plus correct...
Il faut un rajout ici assez grand

Et que veux-tu exactement? As-tu regarder les tutoriaux que je t'avais conseillé?

Note: je déplace dans la section C#


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Actares1456 Messages postés 41 Date d'inscription samedi 13 août 2011 Statut Membre Dernière intervention 21 mai 2012
18 août 2011 à 13:31
Excuse-moi, tu as raison. Eefain j'ai eu 2-3 problèmes donc j'ai pas pu recevoir ton autre message. Je suis désolé, si ça ne t'embête pas ( et si c'est le cas je comprendrait parfaitement), mais si tu pourrais me dire les tutos que tu m'as conseillé, je suis partant pour les lires. Deplus, je n'ai pas bien compris ce que tu entends par "je déplace dans la section C#". Mais c'est vrai que mon formatage est mal foutu et pour être plus correct, parce que j'ai écris une énorme connerie (pardons pour les gros mots) ce n'est pas "mon premiers code" comme on pourait le croire mais mon "premier code aidé ". (Je m'en suis rendu compte plus tard que j'avais oublié de mieux expliquer). Mais pour en revenir a ce que tu me disait, le code qui est écris, je l'ai fait sur "Bloque note" et non pas sur un logiciel de programation (genre Code::Blocks,Visual Basic, Notepad++...). En tous cas, Merci pour ton message

Actares1456
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
18 août 2011 à 13:49
Hello,
Les tuto sont ici
J'ai déplacé ta demande dans la section C# car le code que tu as posté est fait en C#. Or, tu l'avais postée dans le bar. Tu peux voir dans le bandeau en haut de la page que CodeS-SourceS est très vaste: il est nécessaire de poster au bon endroit pour avoir le maximum de réponses pertinentes)

le code qui est écris, je l'ai fait sur "Bloque note" et non pas sur un logiciel de programation (genre Code::Blocks,Visual Basic, Notepad++...)

Arrêtes tout de suite. Utilises plutôt Visual Studio C#

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Actares1456 Messages postés 41 Date d'inscription samedi 13 août 2011 Statut Membre Dernière intervention 21 mai 2012
18 août 2011 à 15:23
Ok, merci c'est top! C'est vrai que Bloque note n'est pas un logiciel de programation informatique. Cepandant, je l'utilise juste pour faire les essai de mes codes. C'est pour éviter que ça bug l'ordi si c'est incorrect.
En tout cas, merci pour ces tutos!
0
Rejoignez-nous