/// <summary> /// 螺旋摘要关键帧变化 /// </summary> /// <param name="spiralSummarization">螺旋摘要</param> /// <param name="keyFrameFrom">旋转的帧</param> /// <param name="duration">持续时间</param> /// <param name="angle">旋转角度</param> /// <returns></returns> public static Storyboard KeyFrameInSpiralMove(SpiralSummarization spiralSummarization, KeyFrame keyFrameFrom, double duration, double angle) { RotateTransform rotateTransform = new RotateTransform(); keyFrameFrom.Image.RenderTransform = rotateTransform; //旋转中心设置 rotateTransform.CenterX = spiralSummarization.Center.X - keyFrameFrom.Left; rotateTransform.CenterY = spiralSummarization.Center.Y - keyFrameFrom.Top; DoubleAnimation myDoubleAnimation = new DoubleAnimation(); myDoubleAnimation.From = 0; myDoubleAnimation.To = -angle; myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration)); if (keyFrameFrom.Image.FindName("rotateTransform") != null) { keyFrameFrom.Image.UnregisterName("rotateTransform"); } NameScope.SetNameScope(keyFrameFrom.Image, new NameScope()); keyFrameFrom.Image.RegisterName("rotateTransform", rotateTransform); Storyboard.SetTargetName(myDoubleAnimation, "rotateTransform"); Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(RotateTransform.AngleProperty)); Storyboard storyboard = new Storyboard(); storyboard.Children.Add(myDoubleAnimation); return(storyboard); }
public PictureTrackerManager(SpiralSummarization spiralSummarization, VideoSummarizationControl _videoSummarizationControl) { _spiralSummarization = spiralSummarization; _inkCanvas = spiralSummarization.InkCanvas; this._videoSummarizationControl = _videoSummarizationControl; this.isFocus = spiralSummarization.IsFocus; }
public GernarateKeyFrame(List <KeyFrame> keyFrames, SpiralSummarization spiralSummarization) { this.keyFrames = keyFrames; this.spiralSummarization = spiralSummarization; this.mySpiral = spiralSummarization.MySpiral; this.points = mySpiral.SpiralStroke.StylusPoints; this.intervalLength = (int)(mySpiral.SpiralWidth * 1.1); }
/// <summary> /// 方向和笔序识别结果匹配和处理 /// </summary> /// <param name="args"></param> void gesture_GestureMatchEvent(MouseGestureEventArgs args) { //记录操作事件与持续时间 recordOperateEvent(args.Present); switch (args.Present) { case "generateSpiralSummarization": //生成新的螺旋摘要 InkCanvas newSpiralInkCanvas = new InkCanvas(); newSpiralInkCanvas.Width = TableGrid.ActualWidth * 0.75; newSpiralInkCanvas.Height = TableGrid.ActualHeight; newSpiralInkCanvas.Background = new SolidColorBrush(Colors.Transparent); newSpiralInkCanvas.Margin = new Thickness(0, TableGrid.ActualHeight * 0.25, 0, 0); double spiralWidth = 0; spiralWidth = 54; MySpiral mySpiral = new MySpiral(spiralWidth, GlobalValues.color, new StylusPoint((double)(int)(newSpiralInkCanvas.Width / 2), (double)(int)(newSpiralInkCanvas.Height / 2)), 3, 10, newSpiralInkCanvas, false); SpiralSummarization newSpiralSummarization = new SpiralSummarization(_inkCollector, mySpiral, selectKeyFrames, false); //SpiralSummarization newSpiralSummarization = new SpiralSummarization(mySpiral, _inkCollector.TileKeyFrames); _inkCanvas.Children.Add(newSpiralInkCanvas); _inkCollector.VideoSummarization = newSpiralSummarization; break; case "spiralSummarization": if (startIndex == int.MinValue && endIndex == int.MinValue) { //先清除原来的两个螺旋摘要 _inkCollector._mainPage.VideoSummarizationControl.keyFrameListScrollViewer.Visibility = Visibility.Visible; ((InkCanvas)_inkCanvas.Children[0]).Children.Clear(); ((InkCanvas)_inkCanvas.Children[0]).Strokes.Clear(); ((InkCanvas)_inkCanvas.Children[1]).Children.Clear(); ((InkCanvas)_inkCanvas.Children[1]).Strokes.Clear(); _inkCanvas.Children.RemoveAt(0); _inkCanvas.Children.RemoveAt(0); ((InkCanvas)_inkCanvas.Children[0]).Margin = new Thickness(0); _inkCollector._mainPage.VideoSummarizationControl.resetTableGrid(); _inkCollector._mainPage.VideoSummarizationControl.keyFrameList._inkCanvas.Children.Clear(); _inkCollector._mainPage.VideoSummarizationControl.keyFrameList2._inkCanvas.Children.Clear(); _inkCollector._mainPage.VideoSummarizationControl.keyFrameListScrollViewer.Visibility = Visibility.Collapsed; _inkCollector._mainPage.VideoSummarizationControl.keyFrameListScrollViewer2.Visibility = Visibility.Collapsed; _inkCollector._mainPage.VideoSummarizationControl.GridBtn.Visibility = Visibility.Visible; _inkCollector._mainPage.VideoSummarizationControl._timeBar.Visibility = Visibility.Visible; _inkCollector._mainPage.VideoSummarizationControl.VideoProgressText.Visibility = Visibility.Visible; _inkCollector._mainPage.VideoSummarizationControl.BtnMerge.Visibility = Visibility.Collapsed; _inkCollector.Mode = InkMode.VideoSummarization; } break; default: //Console.WriteLine("default"); break; } }
/// <summary> /// 移动批量关键帧动画类 /// </summary> /// <param name="spiralSummarization"></param> /// <param name="operationId"></param> /// <param name="insertIndex"></param> /// <param name="fromKeyPointIndexes"></param> /// <param name="toKeyPointIndexes"></param> /// <param name="keyFrames"></param> public MoveKeyFrame(SpiralSummarization spiralSummarization, int operationId, int insertIndex, List <int> fromKeyPointIndexes, List <int> toKeyPointIndexes, List <KeyFrame> keyFrames)//, int index, KeyFrame keyFrame, int startIndex, int endIndex, double duration,bool isInsert) { if (spiralSummarization != null) { spiralSummarization.InkCollector.IsShowUnbrokenKeyFrame = false; } this.operationId = operationId; this.fromKeyPointIndexes = fromKeyPointIndexes; this.toKeyPointIndexes = toKeyPointIndexes; this.keyFrames = keyFrames; this.spiralSummarization = spiralSummarization; this.insertIndex = insertIndex; showCount = keyFrames.Count; this.showSpiralStroke = spiralSummarization.ShowSpiralStroke; this.points = spiralSummarization.Points; for (int i = 1; i < showCount; i++) { int movePointCount = Math.Abs(fromKeyPointIndexes[i] - toKeyPointIndexes[i]); if (movePointCount > maxMovePointCount) { maxMovePointCount = movePointCount; maxMovePointCountIndex = i; } else if (movePointCount < minMovePointCount && movePointCount > 0) { minMovePointCount = movePointCount; } } for (int i = 1; i < showCount; i++) { int movePointCount = Math.Abs(fromKeyPointIndexes[i] - toKeyPointIndexes[i]); int movePointCountPerTime = (int)Math.Floor((double)movePointCount / minMovePointCount); int restPointCount = movePointCount % minMovePointCount; restPointCountList.Add(restPointCount); int moveTime = (int)Math.Ceiling((double)movePointCount / movePointCountPerTime); if (moveTime > maxMoveTime) { maxMoveTime = moveTime; } movePointCountPerTimes.Add(movePointCountPerTime); } }
public override void _presenter_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { Stroke lastStroke = _inkCanvas.Strokes.Last(); if (!(_startPoint.X == 0 && _startPoint.Y == 0)) { //先清空原来选中的关键帧序列 //clearPreMessage(); _currPoint = e.GetPosition(_inkCanvas); if (_currPoint.Y < TableGrid.ActualHeight / 2) { if (_currPoint.X < TableGrid.ActualWidth / 2) { _currPoint.X -= ((InkCanvas)_inkCanvas.Children[0]).Margin.Left; _currPoint.Y -= ((InkCanvas)_inkCanvas.Children[0]).Margin.Top; endIndex = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationLeft.getSelectedKeyFrameIndex(_currPoint); if (startIndex != int.MinValue && endIndex != int.MinValue) { endKeyFrame = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationLeft.KeyFrames[endIndex]; endSpiralSummarization = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationLeft; } _currPoint.X += ((InkCanvas)_inkCanvas.Children[0]).Margin.Left; _currPoint.Y += ((InkCanvas)_inkCanvas.Children[0]).Margin.Top; } //右边的螺旋摘要 else { Point endPointRight = e.GetPosition((InkCanvas)_inkCanvas.Children[1]); endIndex = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationRight.getSelectedKeyFrameIndex(endPointRight); if (startIndex != int.MinValue && endIndex != int.MinValue) { endKeyFrame = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationRight.KeyFrames[endIndex]; endSpiralSummarization = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationRight; } } } else { Point endPointBottom = e.GetPosition((InkCanvas)_inkCanvas.Children[2]); endIndex = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationBottom.getSelectedKeyFrameIndex(endPointBottom); if (startIndex != int.MinValue && endIndex != int.MinValue) { endKeyFrame = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationBottom.KeyFrames[endIndex]; endSpiralSummarization = _inkCollector._mainPage.VideoSummarizationControl.SpiralSummarizationBottom; } } if (startKeyFrame != null && endKeyFrame != null && startKeyFrame != endKeyFrame) { startKeyFrame.HyperLink = endKeyFrame; _inkCollector.HyperLinkKeyFrames.Add(startKeyFrame); startKeyFrame.HyperLinkSpiralSummarization = endSpiralSummarization; _inkCanvas.Strokes.Remove(_inkCanvas.Strokes.Last()); InkTool.getInstance().DrawLine(_startPoint.X, _startPoint.Y, _currPoint.X, _currPoint.Y, _inkCanvas, Colors.Red); InkTool.getInstance().drawPoint(_startPoint.X, _startPoint.Y, 8, Colors.Blue, _inkCanvas); } else { mouseGesture.StopCapture(); _inkCanvas.Strokes.Remove(lastStroke); } _startPoint.X = 0; _startPoint.Y = 0; } }
public override void _presenter_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { if (videoSummarization != null && _startPoint != null && _inkCanvas.Strokes.Count > 0) { Stroke lastStroke = _inkCanvas.Strokes.Last(); //先清空原来选中的关键帧序列 clearPreMessage(); _currPoint = e.GetPosition(_inkCanvas); _currPoint.X -= inkCanvasSpiralSummarizationMargin.Left; _currPoint.Y -= inkCanvasSpiralSummarizationMargin.Top; endIndex = videoSummarization.getSelectedKeyFrameIndex(_currPoint); //记录操作类型与持续时间 recordOperateTrace("UP````````````````````````````````````````````````````Up"); upTime = System.DateTime.Now; if (lastStroke.StylusPoints.Count == 1) { if (startIndex != int.MinValue && startIndex == endIndex && _inkCollector.IsShowUnbrokenKeyFrame) { if (_inkCollector.DefaultSummarizationNum == 0) { mouseGesture.Points.Clear(); } if (GlobalValues.locationQuestions.Count > 0) { if (GlobalValues.CurrLocationId + 1 < GlobalValues.locationQuestions.Count) { if (GlobalValues.locationAnswers[GlobalValues.CurrLocationId].IndexOf(videoSummarization.KeyFrames.IndexOf(videoSummarization.ShowKeyFrames[startIndex]) + 1) != -1) { GlobalValues.CurrLocationId++; GlobalValues.LocationQuestion.setQuestion(GlobalValues.locationQuestions[GlobalValues.CurrLocationId]); VideoSummarizationControl.RecordCurrOperationAndTime("第" + (GlobalValues.CurrLocationId - 1).ToString() + "次定位正确"); GlobalValues.LocationQuestion.TBQuestion.Background = new SolidColorBrush(GlobalValues.LocationQuestionBackGrouds[GlobalValues.CurrLocationId]); } } else { VideoSummarizationControl.RecordCurrOperationAndTime("最后一次定位正确"); switch (GlobalValues.summarizationTypeNo) { case 0: VideoSummarizationControl.Record("Spiral"); break; case 1: VideoSummarizationControl.Record("Tile"); break; case 2: VideoSummarizationControl.Record("Tapestry"); break; } MessageBox.Show("恭喜你完成此项任务!"); VideoSummarizationControl.sWriter.Close(); VideoSummarizationControl.myStream.Close(); Environment.Exit(1); } } //定位视频 if (0 <= startIndex && startIndex < videoSummarization.ShowKeyFrames.Count && VideoSummarizationControl != null) { //定位视频,position的单位是秒 videoSource = videoSummarization.ShowKeyFrames[startIndex].VideoName; VideoSummarizationTool.locateMediaPlayer(VideoSummarizationControl.mediaPlayer, videoSummarization.ShowKeyFrames[startIndex]); //显示超链接 if (hyperLink != null) { VideoSummarizationControl.TableGrid.Children.Remove(hyperLink.Image); } hyperLink = videoSummarization.ShowKeyFrames[startIndex].HyperLink; if (hyperLink != null) { VideoSummarizationControl.hyperLinkPlayer.Visibility = Visibility.Visible; VideoSummarizationTool.locateMediaPlayer(VideoSummarizationControl.hyperLinkPlayer, hyperLink); hyperLinkSpiralSummarization = videoSummarization.ShowKeyFrames[startIndex].HyperLinkSpiralSummarization; VideoSummarizationControl.hyperLinkPlayer.MouseLeftButtonUp += new MouseButtonEventHandler(hyperLinkPlayer_MouseLeftButtonUp); } //记录操作事件与持续时间 recordOperateEvent("locate::::::::::::::::::::::::::::::::::::::Locate"); } } } else { if (_inkCollector.DefaultSummarizationNum == 0) { mouseGesture.StopCapture(); } } _startPoint.X = 0; _startPoint.Y = 0; _inkCanvas.Strokes.Remove(lastStroke); } }
public void VideoPlayTimer_Tick(object sender, EventArgs e) { int videoTimeNow = (int)VideoSummarizationControl.mediaPlayer.Position.TotalMilliseconds; //修改时间轴和播放时间 VideoSummarizationControl._timeBar.Value = videoTimeNow; //修改显示播放进度的值的textbox List <string> timeCurr = new List <string>(); timeCurr = ConvertClass.getInstance().MsToHMS(videoTimeNow); VideoSummarizationControl.VideoProgressText.Text = timeCurr[0] + ":" + timeCurr[1] + ":" + timeCurr[2] + "/" + timeTotalString; //显示超链接关键帧 foreach (KeyFrame keyFrame in _inkCollector.HyperLinkKeyFrames) { if (keyFrame.VideoName == videoSource && (int)(keyFrame.Time / 1000) == (int)(videoTimeNow / 1000)) { if (hyperLink != null) { VideoSummarizationControl.TableGrid.Children.Remove(hyperLink.Image); } hyperLink = keyFrame.HyperLink; VideoSummarizationControl.hyperLinkPlayer.Visibility = Visibility.Visible; VideoSummarizationTool.locateMediaPlayer(VideoSummarizationControl.hyperLinkPlayer, hyperLink); hyperLinkPlayTimer = new System.Windows.Forms.Timer(); hyperLinkPlayTimer.Interval = 8000; hyperLinkPlayTimer.Tick += new System.EventHandler(hyperLinkPlayTimer_Tick); hyperLinkPlayTimer.Start(); hyperLinkSpiralSummarization = keyFrame.HyperLinkSpiralSummarization; VideoSummarizationControl.hyperLinkPlayer.MouseLeftButtonUp += new MouseButtonEventHandler(hyperLinkPlayer_MouseLeftButtonUp); break; } } bool isHasAnnotation = false; bool isHasKeyFrame = false; foreach (KeyFrame keyFrame in videoSummarization.KeyFrames) { if ((int)(keyFrame.Time / 1000) == (int)(videoTimeNow / 1000)) { if (_inkCollector.DefaultSummarizationNum == 0 && _inkCollector.IsShowRedPoint) { //在螺旋摘要中修改螺旋线表明播放到当前帧了 int currIndex = videoSummarization.KeyFrames.IndexOf(keyFrame); if (currPlayKeyFrameStroke != null) { _inkCollector.VideoSummarization.InkCanvas.Strokes.Remove(currPlayKeyFrameStroke); } currPlayKeyFrameStroke = _inkCollector.VideoSummarization.AddPoint2Track(currIndex, Colors.Red, 8); } //显示草图注释 isHasKeyFrame = true; Dictionary <Stroke, KeyFramesAnnotation> s = keyFrame.Annotations; if (s.Count > 0) { KeyValuePair <Stroke, KeyFramesAnnotation> currPair; if (_keyFrameAnnotation != null && keyFramesAnnotation != null) { _keyFrameAnnotation.Visibility = Visibility.Collapsed; _inkCollector._mainPage.LayoutRoot.Children.Remove(_keyFrameAnnotation); _keyFrameAnnotation = null; foreach (int index in keyFramesAnnotation.relatedKeyFrameIndexes) { currPair = (from KeyValuePair <Stroke, KeyFramesAnnotation> anno in _inkCollector.VideoSummarization.ShowKeyFrames[index].Annotations where anno.Value == keyFramesAnnotation select anno).First(); Stroke linkline = (Stroke)(currPair.Key); _inkCollector._mainPage._inkCanvas.Strokes.Remove(linkline); } } _keyFrameAnnotation = new KeyFrameAnnotation(); currPair = (from KeyValuePair <Stroke, KeyFramesAnnotation> anno in keyFrame.Annotations //where anno.Value == _keyFramesAnnotation select anno).First(); keyFramesAnnotation = (KeyFramesAnnotation)(currPair.Value); int firstIndex = 0; int count = 0; foreach (int index in keyFramesAnnotation.relatedKeyFrameIndexes) { if (count == 0) { firstIndex = index; } count++; currPair = (from KeyValuePair <Stroke, KeyFramesAnnotation> anno in videoSummarization.ShowKeyFrames[index].Annotations where anno.Value == keyFramesAnnotation select anno).First(); Stroke stroke = (Stroke)(currPair.Key); if (_inkCanvas.Strokes.IndexOf(stroke) == -1) { _inkCanvas.Strokes.Add(stroke); } } _keyFrameAnnotation.InkCanvasAnnotation.Strokes.Add(keyFramesAnnotation.Strokes); //显示关键帧注释 _keyFrameAnnotation.Width = keyFramesAnnotation.Width; _keyFrameAnnotation.Height = keyFramesAnnotation.Height; _keyFrameAnnotation.VerticalAlignment = VerticalAlignment.Top; if (videoSummarization.ShowKeyFrameCenterPoints[firstIndex].X < videoSummarization.Center.X) { _keyFrameAnnotation.HorizontalAlignment = HorizontalAlignment.Left; } else { _keyFrameAnnotation.HorizontalAlignment = HorizontalAlignment.Right; } _keyFrameAnnotation.Visibility = Visibility.Visible; _inkCollector._mainPage.LayoutRoot.Children.Add(_keyFrameAnnotation); //VideoSummarizationControl.BtnSpiralScreenBack.Visibility = Visibility.Collapsed; //VideoSummarizationControl.BtnSpiralScreen.Visibility = Visibility.Collapsed; isHasAnnotation = true; } break; } } if (isHasKeyFrame && !isHasAnnotation && _inkCollector.Mode != InkMode.AddKeyFrameAnnotationDouble) { KeyValuePair <Stroke, KeyFramesAnnotation> currPair; if (_keyFrameAnnotation != null && keyFramesAnnotation != null) { _keyFrameAnnotation.Visibility = Visibility.Collapsed; foreach (int index in keyFramesAnnotation.relatedKeyFrameIndexes) { currPair = (from KeyValuePair <Stroke, KeyFramesAnnotation> anno in _inkCollector.VideoSummarization.ShowKeyFrames[index].Annotations where anno.Value == keyFramesAnnotation select anno).First(); Stroke linkline = (Stroke)(currPair.Key); _inkCollector._mainPage._inkCanvas.Strokes.Remove(linkline); } } } }