UPDATE(dev): body captor works with the architecture but the body is not disposed where you are

pull/17/head
Johan LACHENAL 1 year ago
parent 3d65446903
commit 6834f13942

@ -0,0 +1,171 @@
using Microsoft.Kinect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows;
using System.Windows.Shapes;
using Lib;
using System.Windows.Controls;
namespace Lib
{
public class BodyImageStream : KinectStream
{
private BodyFrameReader reader;
public BodyFrameReader Reader
{
get { return reader; }
set { reader = value; }
}
private Body[] bodies;
public Body[] Bodies
{
get { return bodies; }
private set { bodies = value; }
}
public override void Stop()
{
if (Reader != null)
{
Reader.Dispose();
Reader = null;
}
}
public BodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas) : base(kinectmanager)
{
var framedescription = kinectmanager.Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
Bitmap = new WriteableBitmap(framedescription.Width, framedescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
reader = kinectmanager.Sensor.BodyFrameSource.OpenReader();
reader.FrameArrived += Reader_BodyFrameArrived;
// initialiser le tableau des corps
this.bodies = new Body[kinectmanager.Sensor.BodyFrameSource.BodyCount];
Canvas = skeletonCanvas;
}
private void drawbone(Body body, JointType JointType0, JointType JointType1)
{
Joint joint0 = body.Joints[JointType0];
Joint joint1 = body.Joints[JointType1];
// ne dessinez que si les deux joints sont suivis
if (joint0.TrackingState == TrackingState.Tracked && joint1.TrackingState == TrackingState.Tracked)
{
Line bone = new Line
{
Stroke = new SolidColorBrush(Colors.LightBlue),
StrokeThickness = 4,
X1 = MapJointToScreen(joint0).X,
Y1 = MapJointToScreen(joint0).Y,
X2 = MapJointToScreen(joint1).X,
Y2 = MapJointToScreen(joint1).Y
};
Canvas.Children.Add(bone);
}
}
private Point MapJointToScreen(Joint joint)
{
ColorSpacePoint colorPoint = this.KinectManager.Sensor.CoordinateMapper.MapCameraPointToColorSpace(joint.Position);
// Gestion des coordonnées infinies
float x = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X;
float y = float.IsInfinity(colorPoint.Y) ? 0 : colorPoint.Y;
return new Point(x, y);
}
private void drawskeleton(Body body)
{
// tête et cou
drawbone(body, JointType.Head, JointType.Neck);
drawbone(body, JointType.Neck, JointType.SpineShoulder);
// torse
drawbone(body, JointType.SpineShoulder, JointType.SpineMid);
drawbone(body, JointType.SpineMid, JointType.SpineBase);
drawbone(body, JointType.SpineShoulder, JointType.ShoulderRight);
drawbone(body, JointType.SpineShoulder, JointType.ShoulderLeft);
drawbone(body, JointType.SpineBase, JointType.HipRight);
drawbone(body, JointType.SpineBase, JointType.HipLeft);
// bras droit
drawbone(body, JointType.ShoulderRight, JointType.ElbowRight);
drawbone(body, JointType.ElbowRight, JointType.WristRight);
drawbone(body, JointType.WristRight, JointType.HandRight);
drawbone(body, JointType.HandRight, JointType.HandTipRight);
drawbone(body, JointType.WristRight, JointType.ThumbRight);
// bras gauche
drawbone(body, JointType.ShoulderLeft, JointType.ElbowLeft);
drawbone(body, JointType.ElbowLeft, JointType.WristLeft);
drawbone(body, JointType.WristLeft, JointType.HandLeft);
drawbone(body, JointType.HandLeft, JointType.HandTipLeft);
drawbone(body, JointType.WristLeft, JointType.ThumbLeft);
// jambe droite
drawbone(body, JointType.HipRight, JointType.KneeRight);
drawbone(body, JointType.KneeRight, JointType.AnkleRight);
drawbone(body, JointType.AnkleRight, JointType.FootRight);
// jambe gauche
drawbone(body, JointType.HipLeft, JointType.KneeLeft);
drawbone(body, JointType.KneeLeft, JointType.AnkleLeft);
drawbone(body, JointType.AnkleLeft, JointType.FootLeft);
// dessinez les joints
foreach (JointType JointType in body.Joints.Keys)
{
Joint joint = body.Joints[JointType];
if (joint.TrackingState == TrackingState.Tracked)
{
DrawJoint(MapJointToScreen(joint));
}
}
}
private void DrawJoint(Point point)
{
Ellipse ellipse = new Ellipse
{
Width = 10,
Height = 10,
Fill = new SolidColorBrush(Colors.Red)
};
Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
Canvas.Children.Add(ellipse);
}
private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
using (var bodyframe = e.FrameReference.AcquireFrame())
{
if (bodyframe != null)
{
bodyframe.GetAndRefreshBodyData(this.bodies);
Canvas.Children.Clear(); // nettoyer le Canvas avant de dessiner
foreach (var body in this.bodies)
{
if (body.IsTracked)
{
// dessiner le squelette
drawskeleton(body);
}
}
}
}
}
}
}

@ -4,12 +4,11 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Media; using System.Windows.Media;
using System.Windows;
using System.Windows.Shapes; using System.Windows.Shapes;
using Lib; using System.Windows;
using System.Windows.Controls;
namespace Lib namespace Lib
{ {
@ -22,6 +21,8 @@ namespace Lib
set { reader = value; } set { reader = value; }
} }
//private ColorFrameReader colorReader;
private Body[] bodies; private Body[] bodies;
public Body[] Bodies public Body[] Bodies
{ {
@ -30,16 +31,12 @@ namespace Lib
} }
public override void Stop() public override void Stop()
{ {
if (reader != null) if (Reader != null)
{ {
reader.Dispose(); Reader.Dispose();
reader = null; Reader = null;
}
} }
private Canvas skeletonCanvas;
public Canvas SkeletonCanvas {
get { return skeletonCanvas; }
private set { skeletonCanvas = value; }
} }
public ColorAndBodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas) : base(kinectmanager) public ColorAndBodyImageStream(KinectManager kinectmanager, Canvas skeletonCanvas) : base(kinectmanager)
@ -50,7 +47,7 @@ namespace Lib
reader.FrameArrived += Reader_BodyFrameArrived; reader.FrameArrived += Reader_BodyFrameArrived;
// initialiser le tableau des corps // initialiser le tableau des corps
this.bodies = new Body[kinectmanager.Sensor.BodyFrameSource.BodyCount]; this.bodies = new Body[kinectmanager.Sensor.BodyFrameSource.BodyCount];
SkeletonCanvas = skeletonCanvas; Canvas = skeletonCanvas;
} }
private void drawbone(Body body, JointType JointType0, JointType JointType1) private void drawbone(Body body, JointType JointType0, JointType JointType1)
@ -71,7 +68,7 @@ namespace Lib
Y2 = MapJointToScreen(joint1).Y Y2 = MapJointToScreen(joint1).Y
}; };
skeletonCanvas.Children.Add(bone); Canvas.Children.Add(bone);
} }
} }
@ -147,7 +144,7 @@ namespace Lib
Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2); Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2); Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
skeletonCanvas.Children.Add(ellipse); Canvas.Children.Add(ellipse);
} }
private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e) private void Reader_BodyFrameArrived(object sender, BodyFrameArrivedEventArgs e)
{ {
@ -157,7 +154,7 @@ namespace Lib
{ {
bodyframe.GetAndRefreshBodyData(this.bodies); bodyframe.GetAndRefreshBodyData(this.bodies);
SkeletonCanvas.Children.Clear(); // nettoyer le Canvas avant de dessiner Canvas.Children.Clear(); // nettoyer le Canvas avant de dessiner
foreach (var body in this.bodies) foreach (var body in this.bodies)
{ {
@ -172,4 +169,3 @@ namespace Lib
} }
} }
} }

@ -5,6 +5,7 @@ using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
@ -26,6 +27,16 @@ namespace Lib
} }
} }
} }
private Canvas _canvas;
public Canvas Canvas
{
get { return _canvas; }
protected set
{
_canvas = value;
OnPropertyChanged(nameof(Canvas));
}
}
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName) public void OnPropertyChanged(string propertyName)
@ -36,6 +47,7 @@ namespace Lib
public KinectStream(KinectManager kinectManager) public KinectStream(KinectManager kinectManager)
{ {
KinectManager = kinectManager; KinectManager = kinectManager;
Canvas = null;
if (kinectManager.Sensor == null) if (kinectManager.Sensor == null)
{ {
KinectManager.StartSensor(); KinectManager.StartSensor();

@ -15,33 +15,33 @@ namespace Lib
private set { _kinectManager = value; } private set { _kinectManager = value; }
} }
private Dictionary<KinectStreams, Func<Canvas,KinectStream>> _streamFactory; private Dictionary<KinectStreams, Func<KinectStream>> _streamFactory;
public Dictionary<KinectStreams, Func<Canvas,KinectStream>> StreamFactory public Dictionary<KinectStreams, Func<KinectStream>> StreamFactory
{ {
get { return _streamFactory; } get { return _streamFactory; }
private set { _streamFactory = value; } private set { _streamFactory = value; }
} }
public KinectStreamsFactory(KinectManager kinect, Canvas skeletonCanvas = null) public KinectStreamsFactory(KinectManager kinect,Canvas SkeletonCanvas)
{ {
_kinectManager = kinect; _kinectManager = kinect;
// Initialisation de la fabrique avec les fonctions de création pour chaque type de flux. // Initialisation de la fabrique avec les fonctions de création pour chaque type de flux.
StreamFactory = new Dictionary<KinectStreams, Func<Canvas,KinectStream>> StreamFactory = new Dictionary<KinectStreams, Func<KinectStream>>
{ {
{ KinectStreams.Color, (canvas) => new ColorImageStream(KinectManager) }, { KinectStreams.Color, () => new ColorImageStream(KinectManager) },
{ KinectStreams.Depth, (canvas) => new DepthImageStream(KinectManager) }, { KinectStreams.Depth, () => new DepthImageStream(KinectManager) },
{ KinectStreams.IR, (canvas) => new InfraredImageStream(KinectManager) }, { KinectStreams.IR, () => new InfraredImageStream(KinectManager) },
{ KinectStreams.ColorAndBody, (canvas) => new ColorAndBodyImageStream(KinectManager,skeletonCanvas) } { KinectStreams.ColorAndBody, () => new BodyImageStream(KinectManager,SkeletonCanvas) }
}; };
} }
public KinectStream this[KinectStreams stream, Canvas skeletonCanvas = null] public KinectStream this[KinectStreams stream]
{ {
get get
{ {
if (StreamFactory.ContainsKey(stream)) if (StreamFactory.ContainsKey(stream))
{ {
return StreamFactory[stream](skeletonCanvas); return StreamFactory[stream]();
} }
else else
{ {

@ -47,6 +47,7 @@
<Reference Include="WindowsBase" /> <Reference Include="WindowsBase" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="BodyImageStream.cs" />
<Compile Include="ColorAndBodyImageStream.cs" /> <Compile Include="ColorAndBodyImageStream.cs" />
<Compile Include="ColorImageStream.cs" /> <Compile Include="ColorImageStream.cs" />
<Compile Include="DepthImageStream.cs" /> <Compile Include="DepthImageStream.cs" />

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
namespace WpfApp
{
public class Bone : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
private double _top;
public double Top
{
get { return _top; }
set {
_top = value;
OnPropertyChanged(nameof(Top));
}
}
public double Left
{
get;
set;
}
public double Diameter
{
get
{
return _diameter;
}
set
{
_diameter = value;
OnPropertyChanged(nameof(Diameter));
}
}
private double _diameter;
public SolidColorBrush ColorBrush {
get;
set;
}
}
}

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApp
{
class Bones : Collection<Bone>
{
public Bones() {
Add(new Bone { });
}
}
}

@ -58,7 +58,7 @@ namespace WpfApp
InitializeComponent(); InitializeComponent();
this.DataContext = this; this.DataContext = this;
KinectManager = new KinectManager(); KinectManager = new KinectManager();
Factory = new KinectStreamsFactory(KinectManager); Factory = new KinectStreamsFactory(KinectManager, skeletonCanvas);
CurrentKinectStream = Factory[KinectStreams.Color]; CurrentKinectStream = Factory[KinectStreams.Color];
Debug.WriteLine(CurrentKinectStream.KinectManager.StatusText); Debug.WriteLine(CurrentKinectStream.KinectManager.StatusText);
CurrentKinectStream.Start(); CurrentKinectStream.Start();
@ -100,7 +100,7 @@ namespace WpfApp
private void ToColorAndBodyImageStream(object sender, RoutedEventArgs e) private void ToColorAndBodyImageStream(object sender, RoutedEventArgs e)
{ {
CurrentKinectStream.Stop(); CurrentKinectStream.Stop();
CurrentKinectStream = Factory[KinectStreams.ColorAndBody,skeletonCanvas]; CurrentKinectStream = Factory[KinectStreams.ColorAndBody];
Debug.WriteLine(CurrentKinectStream.GetType().Name); Debug.WriteLine(CurrentKinectStream.GetType().Name);
CurrentKinectStream.Start(); CurrentKinectStream.Start();
} }

@ -16,7 +16,7 @@ namespace WpfApp
public override DataTemplate SelectTemplate(object item, DependencyObject container) public override DataTemplate SelectTemplate(object item, DependencyObject container)
{ {
if (item is ColorAndBodyImageStream) return ColorAndBodyImageStreamTemplate; if (item is BodyImageStream) return ColorAndBodyImageStreamTemplate;
else return OtherStreamTemplate; else return OtherStreamTemplate;
} }
} }

@ -58,6 +58,8 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</ApplicationDefinition> </ApplicationDefinition>
<Compile Include="Bone.cs" />
<Compile Include="Bones.cs" />
<Compile Include="StreamTemplateSelector.cs" /> <Compile Include="StreamTemplateSelector.cs" />
<Page Include="MainWindow.xaml"> <Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

Loading…
Cancel
Save