2012-03-10 3 views
0

웹캠에서 비디오를 표시하고 피드에서 모션을 감지 할 수있는 간단한 프로그램을 만들었지 만, 모션이 감지되면 웹캠에서 녹화하는 방법을 이해하는 데 문제가 있습니다. Aforge.Net 사이트를 검색했지만 필요한 작업을 이해하기가 어렵습니다. 움직임이 감지되면 미리 지정된 위치로 녹화를 시작하고 움직임이 감지되지 않으면 일정 시간 동안 녹화를 계속 한 다음 중지하고 싶습니다. 이 프로그램은 제가 지금까지 가지고있는 프로그램의 일부입니다 ...모션을 기반으로 웹캠에서 녹화하기. aforge를 사용하는 wpf

더 많은 정보 나 코드를 제공해야 할 필요가 있다면 알려주십시오. 감사합니다

$ // 열기 비디오 소스

private void OpenVideoSource(IVideoSource source) 
    { 
     // set busy cursor 
     //this.Cursor = Cursors.WaitCursor; 

     // close previous video source 
     CloseVideoSource(); 

     //motionDetectionType = 1; 
     //SetMotionDetectionAlgorithm(new TwoFramesDifferenceDetector()); 
     //motionProcessingType = 1; 
     //SetMotionProcessingAlgorithm(new MotionAreaHighlighting()); 

     // start new video source 
     videoSourcePlayer.VideoSource = new AsyncVideoSource(source); 


     videoSourcePlayer.NewFrame +=new VideoSourcePlayer.NewFrameHandler(videoSourcePlayer_NewFrame); 
     //videoSourcePlayer.DesiredFrameRate = 30; 
     //webcam's default frame rate will be used instead of above code that has an error 


     // create new video file 
     writer.Open("test.avi", width, height, 25, VideoCodec.MPEG4); 
     // create a bitmap to save into the video file 
     Bitmap image = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
     // write 1000 video frames 
     for (int i = 0; i < 1000; i++) 
     { 
      image.SetPixel(i % width, i % height, System.Drawing.Color.Red); 
      writer.WriteVideoFrame(image); 
     } 
     writer.Close(); 



     try 
     { 
      videoSourcePlayer.Start(); 
      //motionAlarmLevel = sldMotionSensitivity.Value/100; 
     } 

     catch (Exception x) 
     { 
      System.Windows.MessageBox.Show(x.ToString()); 
     } 
     //videoSource.DesiredFrameSize = new System.Drawing.Size(800,600); 
     videoSourcePlayer.BorderColor = System.Drawing.Color.Blue; 
     // reset statistics 
     statIndex = statReady = 0; 

     // start timers 
     clock.Start(); 
     //alarm.Start(); 

     videoSource = source; 

     //this.Cursor = Cursors.Default; 
    } 

    // Close current video source 
    private void CloseVideoSource() 
    { 
     // set busy cursor 
     //this.Cursor = Cursors.WaitCursor; 

     // stop current video source 
     videoSourcePlayer.SignalToStop(); 

     // wait 2 seconds until camera stops 
     for (int i = 0; (i < 50) && (videoSourcePlayer.IsRunning); i++) 
     { 
      Thread.Sleep(100); 
     } 
     if (videoSourcePlayer.IsRunning) 
      videoSourcePlayer.Stop(); 

     // stop timers 
     clock.Stop(); 
     //alarm.Stop(); 

     motionHistory.Clear(); 

     // reset motion detector 
     if (detector != null) 
      detector.Reset(); 

     //videoSourcePlayer.BorderColor = System.Drawing.Color.Red; 
     //this.Cursor = Cursors.Default; 
    } 

    // New frame received by the player 
    void videoSourcePlayer_NewFrame(object sender, ref Bitmap image) 
    { 

     lock (this) 
     { 
      if (detector != null) 
      { 
       //motion detected 
       if (detector.ProcessFrame(image) > motionAlarmLevel) 
       { 
        //float motionLevel = detector.ProcessFrame(image); 
        videoSourcePlayer.BorderColor = System.Drawing.Color.Red; 
        Dispatcher.BeginInvoke(new ThreadStart(delegate { lblMotionDetected.Content = "Motion Detected"; })); 
        //lblMotionDetected.Content = "Motion Detected"; 
        //flash = (int)(2 * (1000/alarm.Interval)); 
       } 

       // no motion detected 
       if (detector.ProcessFrame(image) < motionAlarmLevel) 
       { 
        videoSourcePlayer.BorderColor = System.Drawing.Color.Black; 
        Dispatcher.BeginInvoke(new ThreadStart(delegate { lblMotionDetected.Content = "No Motion Detected"; })); 
       } 


       // if (motionLevel > motionAlarmLevel) 
       // { 
       //  // flash for 2 seconds 
       //  timer.Start(); 
       // } 

      } 
     } 
    } 

답변