Exemplo n.º 1
0
        /// <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());
            }));
        }
Exemplo n.º 2
0
        /// <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
                };
            }));
        }