Grabación desde una Webcam basada en movimiento. wpf usando aforge

Creé un programa simple que muestra video desde una cámara web y puede detectar movimiento desde la fuente, pero tengo problemas para entender cómo hago para grabar desde la cámara web cuando se detecta movimiento. He buscado en el sitio Aforge.Net pero me resulta difícil entender lo que tengo que hacer. Cuando se detecta movimiento, quiero comenzar a grabar en un destino predeterminado y cuando no se detecta movimiento, quiero continuar grabando durante un período de tiempo determinado y luego detenerme. Esto es parte de mi programa que tengo hasta ahora...

Por favor, ¿pueden ayudarme a explicármelo y avíseme si necesito proporcionar más información o código? Gracias

$// Abrir fuente de video

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

            }
        }
    }

preguntado el 10 de marzo de 12 a las 12:03

1 Respuestas

Hay un proyecto de código abierto llamado ispy - http://www.ispyconnect.com eso hace exactamente eso. La fuente está disponible para descargar.

Respondido 11 Abr '12, 09:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.