Запись с веб-камеры на основе движения.wpf используя aforge - PullRequest
0 голосов
/ 10 марта 2012

Я сделал простую программу, которая отображает видео с веб-камеры и может определять движение по каналу, но у меня возникают проблемы с пониманием того, как я выполняю запись с веб-камеры при обнаружении движения.Я искал на сайте Aforge.Net, но мне трудно понять, что мне нужно делать.Когда обнаруживается движение, я хочу начать запись в заранее определенный пункт назначения, а когда движение не обнаружено, я хочу продолжить запись в течение заданного периода времени, а затем остановиться.Это часть моей программы, которую я имею до сих пор ...

Пожалуйста, вы можете помочь мне объяснить это и сообщить мне, если мне нужно предоставить дополнительную информацию или код.Спасибо

$ // Открытый источник видео

    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();
                //    }

            }
        }
    }

1 Ответ

0 голосов
/ 11 апреля 2012

Есть проект с открытым исходным кодом под названием ispy - http://www.ispyconnect.com, который делает именно это. Источник доступен для скачивания.

...