/// <summary> /// Compute the min DTW distance between seq2 and all possible endings of seq1. /// </summary> /// <param name="seq1">The master array of sequences to compare</param> /// <param name="seq2">The learner array of sequences to compare</param> /// <returns>The best match</returns> public double DtwComputation(ArrayList seq1, ArrayList seq2, ArrayList learnerframe, ArrayList learnercolorframe, string path, double anglethreshold) { // Init var seq1R = new ArrayList(seq1); //seq1R.Reverse(); var seq2R = new ArrayList(seq2); var learnerf = new ArrayList(); var learnerc = new ArrayList(); //seq2R.Reverse(); var tab = new double[seq1R.Count, seq2R.Count]; for (int i = 0; i < seq1R.Count; i++) { for (int j = 0; j < seq2R.Count; j++) { //tab[i, j] = Double.PositiveInfinity; tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold); } } tab[0, 0] = 0; if (_learnerskeletonstream != null) _learnerskeletonstream.Close(); while (FileDelete(@path + "LearnerSelected")) ; _learnerskeletonstream = File.Create(@path + "LearnerSelected"); _lrecorder = new KinectRecorder(KinectRecordOptions.Skeletons, _learnerskeletonstream); if (_learnercolorstream != null) _learnercolorstream.Close(); while (FileDelete(@path + "LearnerSelectedColor")) ; _learnercolorstream = File.Create(@path + "LearnerSelectedColor"); _lcolorrecorder = new BinaryWriter( _learnercolorstream); int []max_slope = new int [3]; // Dynamic computation of the DTW matrix. for (int i = 1; i < seq1R.Count; i++) { for (int j = 1; j < seq2R.Count; j++) { switch (min(tab[i, j - 1], tab[i - 1, j - 1], tab[i - 1, j])) { case 1: if(max_slope[0]++ %6 != 0) tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold) + tab[i, j - 1]; else tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold) + tab[i - 1, j - 1]; max_slope[1] = 0; max_slope[2] = 0; break; case 2: tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold) + tab[i - 1, j - 1]; max_slope[0] = 0; max_slope[2] = 0; break; case 3: if (max_slope[2]++ % 6 != 0) tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold) + tab[i - 1, j - 1]; else tab[i, j] = Marker((System.Windows.Point[])seq1R[i], (System.Windows.Point[])seq2R[j], anglethreshold) + tab[i - 1, j]; max_slope[0] = 0; max_slope[1] = 0; break; default: tab[i, j] = double.PositiveInfinity; break; } } } int totalframe = 0; int correctframe = 0; bool chosen = false; //Reconstruct the best matched path //int currentI = bestMatchI; //int currentJ = bestMatchI; int currentI = seq1R.Count - 1; int currentJ = seq2R.Count - 1; while (currentI != 0 && currentJ != 0) { //Console.WriteLine(target.I + " " + target.J); switch (min(tab[currentI, currentJ - 1], tab[currentI - 1, currentJ - 1], tab[currentI - 1, currentJ])) { case 1: currentJ--; chosen = false; break; case 2: currentI--; currentJ--; learnerf.Add((SkeletonFrame)learnerframe[currentJ]); if (currentJ < learnercolorframe.Count) learnerc.Add((int)learnercolorframe[currentJ]); correctframe++; chosen = false; break; case 3: currentI--; learnerf.Add((SkeletonFrame)learnerframe[currentJ]); if(currentJ < learnercolorframe.Count) learnerc.Add((int)learnercolorframe[currentJ]);// sometimes the color image frame number is smaller if(!chosen) correctframe++; chosen = true; break; default: currentJ--; chosen = false; break; } totalframe++; } while (learnerf.Count != 0) { _lrecorder.Record((SkeletonFrame)learnerf[learnerf.Count - 1]); learnerf.RemoveAt(learnerf.Count - 1); } using (FileStream fs = File.OpenRead(".\\colorStream")) { using (BinaryReader reader = new BinaryReader(fs)) { int temp = reader.ReadInt32(); _lcolorrecorder.Write(temp); CreateFromReader(reader); while (learnerc.Count != 0) { if (FrameNumber == (int)learnerc[learnerc.Count - 1]) { Record(_lcolorrecorder); learnerc.RemoveAt(learnerc.Count - 1); } else { CreateFromReader(reader); } } } } _learnerskeletonstream.Close(); _lrecorder.Stop(); _learnercolorstream.Close(); _lcolorrecorder.Close(); return (Double)correctframe / (Double)totalframe * 100; }