Пример #1
0
        public override HiddenModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap)
        {
            var strokes      = traces.ToArray();
            var symbolTraces = strokes.Select(s => strokeMap.getSymbolTrace(s)).ToArray();

            var transitionDatas = strokeMap.Areas.Select((a, i) => transitionSetup.createTransitionDataToArea(i, "S" + strokeMap.ID + "_A" + (i + 1))).ToArray();

            foreach (var symTrace in symbolTraces)
            {
                var prevT = symTrace[0].Time;
                for (int i = 1; i < symTrace.Length; i++)
                {
                    var dT = (int)(symTrace[i].Time - prevT);
                    prevT = symTrace[i].Time;
                    transitionDatas[i - 1].addData(dT);
                }
            }

            var   startState = new StartState();
            State curState   = startState;
            State nextState;

            foreach (var transData in transitionDatas)
            {
                nextState = new State();
                var transition = transData.createTransition(nextState);
                curState.addTransition(transition);
                curState = nextState;
            }

            var model = new HiddenModel(startState, curState);

            return(model);
        }
 public TrajectoryModel(CHnMMClassificationSystem system, string name, IEnumerable <BaseTrajectory> trainingData)
 {
     recognitionSystem = system;
     Name      = name;
     strokeMap = system.HiddenModelCreator.createStrokeMap(trainingData);
     model     = system.HiddenModelCreator.createModel(trainingData, strokeMap);
 }
        public override CHnMModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap)
        {
            var strokes      = traces.ToArray();
            var symbolTraces = strokes.Select(s => strokeMap.getSymbolTrace(s)).ToArray();

            var transitionDatas = strokeMap.Areas.Select((a, i) => transitionSetup.createTransitionDataToArea(i, "S" + strokeMap.ID + "_A" + (i + 1))).ToArray();

            foreach (var symTrace in symbolTraces)
            {
                if (symTrace != null)
                {
                    var has_empty = symTrace.Where(w => w == null).ToArray();
                    if (has_empty.Length == 0)
                    {
                        var symTrace_clean = symTrace.Where(w => w.Symbol != "GestureStart").ToArray();
                        var prevT          = symTrace[0].Time;
                        for (int i = 0; i < symTrace_clean.Length; i++)
                        {
                            var dT = (int)(symTrace_clean[i].Time - prevT);
                            prevT = symTrace_clean[i].Time;
                            transitionDatas[i].addData(dT);;
                        }
                    }
                    else
                    {
                        //handle the empty datas here
                    }
                }
            }

            var   startState = new StartState();
            State curState   = startState;
            State nextState;

            int ai = 0;

            foreach (var transData in transitionDatas)
            {
                nextState = new State();
                var transition = transData.createTransition(nextState, strokeMap.Areas[ai++]);
                curState.addTransition(transition);
                curState = nextState;
            }

            var model = new CHnMModel(startState, curState);

            return(model);
        }
        public override CHnMModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap)
        {
            var strokes      = traces.ToArray();
            var symbolTraces = strokes.Select(s => strokeMap.getSymbolTrace(s)).ToArray();

            var transitionDatas = strokeMap.Areas.Select((a, i) => transitionSetup.createTransitionDataToArea("S" + strokeMap.ID + "_A" + (i + 1))).ToArray();

            ////number of areas -> transitiondata to endState
            //var endTransitions = new Dictionary<int,TransitionData>(15);

            var endTransitionData = transitionSetup.createTransitionDataToEnd();


            foreach (var symTrace in symbolTraces)
            {
                var prevT = symTrace[0].Time;             //GestureStart is dummy symbol marking the beginning
                for (int i = 1; i < symTrace.Length; i++) //go through all symbols of a trace (except GestureEnd)
                {
                    var dT = (int)(symTrace[i].Time - prevT);
                    prevT = symTrace[i].Time;

                    if (i == symTrace.Length - 1)
                    {
                        endTransitionData.addData(dT);
                        //TransitionData endTransition;
                        //if(endTransitions.TryGetValue(i, out endTransition))
                        //{
                        //    endTransition.addData(dT);
                        //}
                        //else
                        //{
                        //    Debug.Assert(symTrace[i].Symbol == "GestureEnd");
                        //    endTransition = transitionSetup.createTransitionDataToEnd(); //use endtransition
                        //    endTransition.addData(dT);
                        //    endTransitions[i] = endTransition;
                        //}
                    }
                    else
                    {
                        transitionDatas[i - 1].addData(dT);
                    }
                }
            }

            //var endTransPositions = endTransitions.Select(e => e.Key).OrderBy(x => x).ToArray();
            //Debug.Assert(endTransPositions.Last() - endTransPositions.First() == endTransitions.Count-1);

            var   startState = new StartState();
            var   areaStates = new State[strokeMap.Areas.Length];
            var   endState   = new State();
            State curState   = startState;
            State nextState;

            int curAreaState = 0;

            foreach (var transData in transitionDatas)
            {
                nextState = new State();
                areaStates[curAreaState++] = nextState;
                var transition = transData.createTransition(nextState, null);
                curState.addTransition(transition);
                curState = nextState;
            }

            curState.addTransition(endTransitionData.createTransition(endState, null));

            //add end transitions
            //foreach(var end in endTransitions)
            //{
            //    var prevAreaState = areaStates[end.Key - 2];
            //    prevAreaState.addTransition(end.Value.createTransition(endState));
            //}

            var model = new CHnMModel(startState, endState);

            return(model);
        }
 public abstract CHnMModel createModel(IEnumerable <BaseTrajectory> traces, StrokeMap strokeMap);
Пример #6
0
        public static void DrawStrokeMap(GestureRecognitionLib.CHnMM.StrokeMap strokeMap, Canvas DrawCanvas, Color color, bool isTranslationInvariant)
        {
            var h = DrawCanvas.ActualHeight;
            var w = DrawCanvas.ActualWidth;

            var offsetX = 0d;
            var offsetY = 0d;

            if (isTranslationInvariant)
            {
                //move translationinvariant gestures to canvas center
                var minX = strokeMap.Areas.Cast <Circle>().Min(a => a.X);
                var maxX = strokeMap.Areas.Cast <Circle>().Max(a => a.X);

                var minY = strokeMap.Areas.Cast <Circle>().Min(a => a.Y);
                var maxY = strokeMap.Areas.Cast <Circle>().Max(a => a.Y);

                double width  = maxX - minX;
                double height = maxY - minY;

                double traceCenterX = minX + (width / 2);
                double traceCenterY = minY + (height / 2);

                offsetX = 0.5 - traceCenterX;
                offsetY = 0.5 - traceCenterY;
            }

            //int i = 1;
            foreach (var iarea in strokeMap.Areas)
            {
                var area = iarea as Circle;

                var absX          = (area.X + offsetX) * w;
                var absY          = (area.Y + offsetY) * h;
                var absCircleW    = area.Radius * w * 2;
                var absCircleH    = area.Radius * h * 2;
                var absTolCircleW = area.ToleranceRadius * w * 2;
                var absTolCircleH = area.ToleranceRadius * h * 2;

                var circle = new Ellipse();
                circle.Width           = absCircleW;
                circle.Height          = absCircleH;
                circle.Fill            = null;
                circle.Stroke          = new SolidColorBrush(color);
                circle.StrokeThickness = 1.5;
                circle.SetValue(Canvas.LeftProperty, absX - absCircleW / 2);
                circle.SetValue(Canvas.TopProperty, absY - absCircleH / 2);

                var tolCircle = new Ellipse();
                tolCircle.Width           = absTolCircleW;
                tolCircle.Height          = absTolCircleH;
                tolCircle.Fill            = null;
                tolCircle.Stroke          = new SolidColorBrush(Color.Multiply(color, 0.9f));
                tolCircle.StrokeDashArray = new DoubleCollection(new double[] { 3 });
                //tolCircle.StrokeDashOffset = 2;
                tolCircle.StrokeThickness = 1;
                tolCircle.SetValue(Canvas.LeftProperty, absX - absTolCircleW / 2);
                tolCircle.SetValue(Canvas.TopProperty, absY - absTolCircleH / 2);

                //var curFillBrush = baseFillBrush.Clone();
                //curFillBrush.Opacity = opacity;

                //circle.Fill = curFillBrush;
                ////circle.SetValue(Ellipse.FillProperty, FillBrush);
                //circle.Stroke = StrokeBrush;
                //circle.SetValue(Canvas.LeftProperty, (double)(p.X * 600 - size));
                //circle.SetValue(Canvas.TopProperty, (double)(p.Y * 600 - size));

                DrawCanvas.Children.Add(circle);
                DrawCanvas.Children.Add(tolCircle);
            }
        }