Exemple #1
0
        private static void LogTrackedPerson(TrackedPerson trackedPerson)
        {
            // Get file name
            var analyticsFilePath = GetFileNameFromDateTime();

            List <TrackedPerson> persons;

            if (File.Exists(analyticsFilePath))
            {
                // Deserialize our saved analytics
                var jsonString = File.ReadAllText(analyticsFilePath, Encoding.UTF8);
                persons = JsonConvert.DeserializeObject <List <TrackedPerson> >(jsonString);
            }
            else
            {
                // Create new analytics file
                persons = new List <TrackedPerson>();
            }

            // Add our new person
            persons.Add(trackedPerson);

            string newJson = JsonConvert.SerializeObject(persons.ToArray());

            // Make sure that our directory exisits
            Directory.CreateDirectory("log/Analytics");

            File.WriteAllText(analyticsFilePath, newJson);

            log.Info(string.Format("Person Logged {0}", DateTime.UtcNow));
        }
Exemple #2
0
        private IDisposable SubscribeToFace(TrackedPerson person, IObservable <FaceFrameResult> faceFrameObservable)
        {
            var faceSubscription = faceFrameObservable
                                   .Where(t => t.TrackingId == person.TrackingId)
                                   .Subscribe(faceFrameResult =>
            {
                if (config.Track.Engadged)
                {
                    var isEngadged = faceFrameResult.FaceProperties[FaceProperty.Engaged] == DetectionResult.Yes;
                    if (isEngadged)
                    {
                        person.Engaged = true;
                    }
                }

                if (config.Track.Happy)
                {
                    var isHappy = faceFrameResult.FaceProperties[FaceProperty.Happy] == DetectionResult.Yes;
                    if (isHappy)
                    {
                        person.Happy = true;
                    }
                }

                var orderedTrackedBodies = bodies.Where(b => b != null && b.IsTracked).OrderBy(b => b.TrackingId);
                var currentIndex         = Array.FindIndex(orderedTrackedBodies.ToArray(), b => b.TrackingId == person.TrackingId);

                if (currentIndex >= orderedTrackedBodies.Count() - 1)
                {
                    currentIndex = 0;
                }
                else
                {
                    //iterate index
                    currentIndex += 1;
                }

                var newTrackingId = orderedTrackedBodies.Skip(currentIndex).Select(b => b.TrackingId).FirstOrDefault();

                if (newTrackingId == 0)
                {
                    newTrackingId = person.TrackingId;
                }

                faceFrameSource.TrackingId = newTrackingId;
            });

            return(new CompositeDisposable
            {
                faceSubscription
            });
        }
Exemple #3
0
        public void Start()
        {
            SendInfo("People Tracker Started");

            this.bodySubscriptions = new Dictionary <ulong, IDisposable>();
            this.faceSubscriptions = new Dictionary <ulong, IDisposable>();
            this.trackedPeople     = new Dictionary <ulong, TrackedPerson>();

            bodies = new Body[kinect.BodyFrameSource.BodyCount];

            var bodyReader          = this.kinect.BodyFrameSource.OpenReader();
            var bodyFrameObservable = this.kinect
                                      .BodyFrameArrivedObservable(bodyReader)
                                      .SelectBodies(bodies).Sample(TimeSpan.FromSeconds(1));

            faceFrameSource = new FaceFrameSource(kinect,
                                                  0,
                                                  FaceFrameFeatures.FaceEngagement |
                                                  FaceFrameFeatures.Happy |
                                                  FaceFrameFeatures.Glasses);

            var faceReader = faceFrameSource.OpenReader();

            var faceFramesObservable = Observable.FromEvent <FaceFrameArrivedEventArgs>(
                ev => { faceReader.FrameArrived += (s, ei) => ev(ei); },
                ev => { faceReader.FrameArrived -= (s, ei) => ev(ei); }).SelectFaceFrame();

            kinect.SceneChanges()
            .Subscribe(_ =>
            {
                var trackingId = _.SceneChangedType.TrackingId;

                if (_.SceneChangedType is PersonEnteredScene)
                {
                    SendInfo(string.Format("Person {0} entered scene", trackingId));
                    TrackedPerson person = new TrackedPerson()
                    {
                        TrackingId = trackingId, EnteredScene = DateTime.UtcNow
                    };
                    trackedPeople.Add(trackingId, person);
                    bodySubscriptions.Add(trackingId, SubscribeToBody(person, bodyFrameObservable, faceFramesObservable));
                    faceFrameSource.TrackingId = trackingId;
                }
                else if (_.SceneChangedType is PersonLeftScene)
                {
                    var person          = trackedPeople[trackingId];
                    person.LeftScene    = DateTime.UtcNow;
                    person.TotalInScene = person.LeftScene - person.EnteredScene;

                    SendInfo(string.Format("Person {0} left the scene {1} Engaged:{2} Happy:{3} Height:{4} FirstLocation:{5} LastLocation:{6}",
                                           trackingId,
                                           person.TotalInScene,
                                           person.Engaged,
                                           person.Happy,
                                           person.Height,
                                           person.FirstLocation,
                                           person.LastLocation));

                    trackedPeople.Remove(trackingId);

                    var subscription = bodySubscriptions[trackingId];
                    bodySubscriptions.Remove(trackingId);
                    subscription.Dispose();

                    SendPerson(person);
                }
            });
        }
Exemple #4
0
 public TrackedPersonEventArgs(TrackedPerson trackedPerson)
 {
     this.TrackedPerson = trackedPerson;
 }
Exemple #5
0
 private void SendPerson(TrackedPerson trackedPerson)
 {
     OnPersonJustLeft(new TrackedPersonEventArgs(trackedPerson));
 }
Exemple #6
0
        private IDisposable SubscribeToBody(TrackedPerson person, IObservable <Body[]> bodyFrameObservable, IObservable <FaceFrameResult> faceFrames)
        {
            var bodySubscription = bodyFrameObservable.SelectTracked(person.TrackingId)
                                   .Subscribe(body =>
            {
                if (config.Track.Position)
                {
                    //Set first location
                    var location = body.Joints[JointType.SpineBase].Position.GetXYZ();
                    if (string.IsNullOrEmpty(person.FirstLocation))
                    {
                        person.FirstLocation = location;
                    }

                    person.LastLocation = location;
                }

                if (config.Track.RightHandRasied)
                {
                    var WristRight = body.Joints[JointType.WristRight];
                    var ElbowRight = body.Joints[JointType.ElbowRight];

                    if (WristRight.Position.Y > ElbowRight.Position.Y)
                    {
                        person.RightHandRaised = true;
                    }
                }

                if (config.Track.LeftHandRasied)
                {
                    var WristLeft = body.Joints[JointType.WristLeft];
                    var ElbowLeft = body.Joints[JointType.ElbowLeft];

                    if (WristLeft.Position.Y > ElbowLeft.Position.Y)
                    {
                        person.LeftHandRaised = true;
                    }
                }

                if (config.Track.Height)
                {
                    if (body.Joints[JointType.Head].TrackingState == TrackingState.Tracked &&
                        body.Joints[JointType.FootLeft].TrackingState == TrackingState.Tracked)
                    {
                        var height = HeightHelper.Height(body);

                        if (person.MaxHeight < height)
                        {
                            person.MaxHeight = height;
                        }

                        if (person.MinHeight > height || person.MinHeight == 0)
                        {
                            person.MinHeight = height;
                        }

                        person.Height = (person.MaxHeight + person.MinHeight) / 2;
                    }
                    else
                    {
                        person.MaxHeight = 0;
                        person.MinHeight = 0;
                    }
                }
            });

            var faceSubscription = SubscribeToFace(person, faceFrames);

            return(new CompositeDisposable
            {
                bodySubscription,
                faceSubscription
            });
        }