/// <summary> /// Returns an observable that calls on next when persons enter the scene or leave the scene. /// </summary> /// <param name="kinectSensor">The kinect sensor.</param> /// <returns>The observable sequence.</returns> public static IObservable <SceneChangedEventArgs> SceneChanges(this KinectSensor kinectSensor) { // TODO: Hack, In update 06 2014 the BodyCount property was removed on BodyFrameSource. var bodiesInScene = new Dictionary <ulong, Body>(6); Body[] bodies = null; return(Observable.Create <SceneChangedEventArgs>(observer => { return kinectSensor.BodyFrameArrivedObservable() .SelectBodies(bodies) .Subscribe(bs => { bs.Where(b => b != null && b.IsTracked) .Where(b => bodiesInScene.ContainsKey(b.TrackingId) == false) // were not yet in scene .ForEach(b => { bodiesInScene.Add(b.TrackingId, b); observer.OnNext(new SceneChangedEventArgs(new PersonEnteredScene(b.TrackingId))); }); var toRemove = bodiesInScene.Keys .Except(bs.Select(b => b.TrackingId)) .ToList(); toRemove.ForEach(_ => { bodiesInScene.Remove(_); observer.OnNext(new SceneChangedEventArgs(new PersonLeftScene(_))); }); }, e => observer.OnError(e), () => observer.OnCompleted()); })); }
/// <summary> /// Converts the BodyFrameArrived event to an observable sequence. /// </summary> /// <param name="kinectSensor">The kinect sensor.</param> /// <returns>The observable sequence.</returns> public static IObservable <BodyFrameArrivedEventArgs> BodyFrameArrivedObservable(this KinectSensor kinectSensor) { if (kinectSensor == null) { throw new ArgumentNullException("kinectSensor"); } return(Observable.Create <BodyFrameArrivedEventArgs>(observer => { var reader = kinectSensor.BodyFrameSource.OpenReader(); var disposable = kinectSensor.BodyFrameArrivedObservable(reader) .Subscribe(x => observer.OnNext(x), e => observer.OnError(e), () => observer.OnCompleted()); return new CompositeDisposable { disposable, reader }; })); }