/// <summary> /// ユーザのセグメンテーションと新IDの割り当て /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Segmentation_Click(object sender, RoutedEventArgs e) { UserSegmentation[] segm = new UserSegmentation[frameSequence.recordNum]; for (int i = 0; i < frameSequence.recordNum; i++) { segm[i] = UserSegmentation.Segment(frameSequence.GetMotionDataSequence(i), new TimeSpan(0, 0, 1)); } frameSequence.Segmentations = segm.ToList(); // 統合IDの生成 segm = UserSegmentation.Identification(frameSequence, 1); frameSequence.Segmentations = segm.ToList(); // UserIdを選択するUIのリフレッシュ this.UpdateIntegratedIds(); }
public static UserSegmentation Segment(IEnumerable <MotionData> recordData, TimeSpan segmentTimeSpan) { int numUser = 0; UserSegmentation segm = new UserSegmentation(); Dictionary <ulong, Tuple <int, DateTime> > currentConversions = new Dictionary <ulong, Tuple <int, DateTime> >(); int frameIndex = 0; foreach (MotionData md in recordData) { bool changed = false; foreach (ulong user in md.bodies.ToList().Select(b => b.TrackingId)) { Tuple <int, DateTime> converted; if (currentConversions.TryGetValue(user, out converted)) { // 前回と比べて時間内なら継続 if (md.TimeStamp - converted.Item2 <= segmentTimeSpan) { currentConversions[user] = new Tuple <int, DateTime>(converted.Item1, md.TimeStamp); continue; } } // 新しい番号を与える currentConversions[user] = new Tuple <int, DateTime>(numUser, md.TimeStamp); numUser++; changed = true; } if (changed) { segm.Conversions[frameIndex] = currentConversions.ToDictionary(p => p.Key, p => p.Value.Item1); } frameIndex++; } segm._numUsers = numUser; return(segm); }