Deteccion de Movimiento con Vb.net y WebCam

Una aplicacion muy util e interesante que se puede realizar con una simple webcam y nuestro pc es un detector de movimiento, para saber en todo momento que ocurre en el lugar donde se encuentra la camara vigilando. Para lograr esto Crearemos una aplicacion en vb.net que permita visualizar las imagenes capturadas con la camara web y procesarlas con el paquete de librerias que nos ofrece AForge.Net y determinar si existe movimiento, de tal manera la presentacion de la aplicacion a realizar tendra la siguiente interfaz:

Bien Amigos para comenzar, es conveniente descargar, el paquete de librerias que nos suministra AForge.Net, a traves del siguiente link Descargar Librerias y una vez descargado, crear un nuevo proyecto de vb.net….

Luego de haber creado y guardado un nuevo proyecto de vb.net procedemos a descomprimir la ls librerias de AForge y a entrar a la carpeta samples para copiar las librerias que vamos a utilizar:

Debemos tener en cuenta que nos basaremos en el ejemplo de la carpeta Vision llamado motion detector, asi que lo seleccionamos y luego accedemos a la carpeta debug del proyecto tal y como se ve en la siguiente imagen:

y procedemos a copiarlas a la carpeta debug del proyecto que hemos creado en vb.net:

Luego si pasamos a vb, agregamos las referencias de las librerias al proyecto, para ello hacemos clic derecho sobre la carpeta Referencias que esta a la izquierda de la ventana en el explorador de soluciones y se nos abrira la siguiente interfaz:

alli seleccionamos la pestaña examinar y navegamos sobre el directorio de nuestro proyecto pasamos a la carpeta debug y escogemos todas las librerias que alli se encuentran, por ultimo presionamos el boton aceptar.

Listo, una vez agregadas las referencias podemos ver que aparecen en el explorador de soluciones, en la parte derecha de la ventana, ahora procedemos a agregar varios controles al formulario como los que se ven a continuacion:

agregamos 3 botones, 1 combobox, 1 groupbox,2 timer y varios labels para detallar informacion.

A continuacion vamos a agregar el control VideoSourcePlayer que es el que permitira visualizar las imagenes de la webcam, para ello hacemos clic derecho sobre algun control del cuadro de herramientas y en el menu desplegable que aparece escogemos la opcion Elegir elementos, tal y como se ve en la siguiente imagen:

Luego en la ventana que aparece, estando en la pestaña Componentes de .Net Framework presionamos el boton examinar y en el nuevo cuadro emergente, buscamos la carpeta de nuestro proyecto y accedemos a la carpeta debug para seleccionar la libreria AForge.Controls.dll, luego presionamos abrir como se observa en la imagen:

Despues procedemos  hacer clic en aceptar habiendo agregado los controles:

Luego, vemos que el control VideoSourcePlayer ya aparece en la lista de herramientas:

Procedemos a agregarlo al formulario:

Bien amigos, ya en cuestion de diseño hemos finalizado, ahora pasemos a la seccion del codigo.

Importemos las siguientes librerias:

Imports AForge.Video.DirectShow
Imports AForge.Video
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Text
Imports System.Windows.Forms
Imports System.Threading
Imports AForge
Imports AForge.Imaging
Imports AForge.Video.VFW
Imports AForge.Vision.Motion

Ahora declaremos las siguientes variables como globales:

' Creamos una variable del tipo Thread
Private sonido As Thread

' creamos un contador
Dim i As Integer

Private motionAlarmLevel As Single = 0.015F

' motion detector
Private detector As New MotionDetector(New TwoFramesDifferenceDetector(), New MotionAreaHighlighting())

Private Dispositivos_Disponibles As Boolean = False

Private Disp_Video As FilterInfoCollection

Private WithEvents FuenteDeVideo As VideoCaptureDevice = Nothing

Bien, a continuacion pasemos a crear la siguiente funcion con la cual realizaremos la busqueda de dispositivos:

Sub Busca_Dispositivos()
Disp_Video = New FilterInfoCollection(FilterCategory.VideoInputDevice)
If Disp_Video.Count = 0 Then
Dispositivos_Disponibles = False
Else
Dispositivos_Disponibles = True
Carga_Dispositivos()
Button_iniciar.Enabled = True
End If
End Sub

Ahora creemos la funcion o subrutina para detener o finalizar la captura de video

Sub Termina_FuenteDeVideo()
If Not (FuenteDeVideo Is Nothing) Then
If FuenteDeVideo.IsRunning Then
FuenteDeVideo.SignalToStop()
FuenteDeVideo = Nothing
End If
End If
End Sub

luego, viene el procedimiento para cargar los dispositivos

Sub Carga_Dispositivos()
For i As Integer = 0 To Disp_Video.Count - 1
combo_dispositivos.Items.Add(Disp_Video(i).Name.ToString())
Next
combo_dispositivos.Text = combo_dispositivos.Items(0).ToString()
End Sub

Ahora pasemos al evento load del formulario, alli habilitaremos el timer 1 y llamaremos al procedimiento Busca_Dispositivos

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

i = 0

Me.Timer_alarma.Enabled = False

Me.Timer1.Enabled = True

Busca_Dispositivos()

End Sub

de manera siguiente codifiquemos lo que se realizara si se hace click sobre el boton iniciar:

Private Sub iniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_iniciar.Click

Try

If Dispositivos_Disponibles Then

FuenteDeVideo = New VideoCaptureDevice(Disp_Video(combo_dispositivos.SelectedIndex).MonikerString)

AddHandler FuenteDeVideo.NewFrame, New NewFrameEventHandler(AddressOf video_NuevoFrame)

FuenteDeVideo.Start()

combo_dispositivos.Enabled = False

End If

Catch ex As Exception

End Try

End Sub

y despues pasemos a programar las instrucciones a realizar en el boton detener:

Private Sub Button_detener_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_detener.Click

Try

If FuenteDeVideo.IsRunning Then

Termina_FuenteDeVideo()

combo_dispositivos.Enabled = True

End If

Catch ex As Exception

End Try

End Sub

A continuacion creamos la funcion video_NuevoFrame() que sera la encargada de recibir las imagenes de la webcam, procesarla y determinar si existe movimiento, de ser asi al final de la funcion se mostrara el video obtenido de la camara web y una capa superpuesta de color rojo que indica las partes donde ha ocurrido movimiento:

Private Sub video_NuevoFrame(ByVal sender As Object, ByVal eventArgs As NewFrameEventArgs)

'entra aqui mientras no se haya detectado movimiento

Dim Imagen As Bitmap = DirectCast(eventArgs.Frame.Clone(), Bitmap)

If detector IsNot Nothing Then

Dim motionLevel As Single = detector.ProcessFrame(Imagen)

If motionLevel > motionAlarmLevel Then

Me.Button_indica_mov.ForeColor = Color.White

Me.Button_indica_mov.Text = "Si hay Movimiento"

Me.Button_indica_mov.BackColor = Color.Red

'MessageBox.Show("objeto detectado", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information)

Else

Me.Button_indica_mov.ForeColor = Color.Black

Me.Button_indica_mov.Text = "No hay Movimiento"

Me.Button_indica_mov.BackColor = Color.Yellow

End If

webcam.Image = Imagen

End If

End Sub

Luego Programaremos las funciones a realizar en el timer1, hay que aclarar que este control posee un intervalo de tiempo menor a 1 segundo (le he colocado 10 milisegundos) para que desde el inicio de la aplicacion y muy rapidamente este pendiente ante algun cambio o movimiento detectado. A traves de este timer se procede a activar al siguiente llamado timer_alarma:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

If (Me.Button_indica_mov.BackColor = Color.Red) Then

i = 1

Me.Timer_alarma.Enabled = True

Me.Timer1.Enabled = False

End If

End Sub

Aqui lo que se hace es determinar si el boton indica_mov a cambiado a color rojo, de ser asi ha ocurrido algun movimiento, inmediatamente se coloca la variable i en 1, se activa el timer alarma y se desactiva el timer 1.

A continuacion Colocamos lo siguiente en el timer_alarma:


Private Sub Timer_alarma_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_alarma.Tick

If (i = 1) Then

'crear objeto y asignarlo al sub que queremos ejecutar

sonido = New Thread(AddressOf reproducir_sonido)

'ponemos al hilo en marcha

sonido.Start()

End If

If (i = 6) Then

Me.Timer_alarma.Enabled = False

Me.Timer1.Enabled = True

'detenemos el hilo

sonido.Abort()

End If

i += 1

End Sub

Es conveniente indicar que el timer_alarma tiene un intervalo de tiempo de 1 segundo, es decir, de 1000 milisegundos, y aqui lo que se hace es reproducir un sonido caracteristico de una alarma o sirena de emergencia, y solo lo hara al cumplirse el primer segundo o entrar al timer, para evitar que la aplicacion se bloquee al realizar el proceso de reproduccion de sonido y captura de imagenes, creamos una hebra de proceso llamada sonido la cual ejecuta de forma paralela la funcion reproducir sonido, luego de transcurrir unos 5 segundos detenemos el timer alarma, activamos nuevamente el timer 1 y finalizamos la hebra o hilo de ejecucion.

Al final se puede obserbar el procedimiento reprocucir sonido que hace sonar la alarma:

Sub reproducir_sonido()
My.Computer.Audio.Play("Alerta.wav", AudioPlayMode.WaitToComplete)
End Sub

Bueno amigos, es hora de probar nuestra aplicacion, para ello la ejecutamos y veremos que se nos cargara el formulario, procedemos a escoger en el combobox la camara que vamos a utilizar para la vigilancia:

Luego se hace clic sobre el boton iniciar y de inmediato podremos ver la imagen en vivo de la webcam, cuando el boton esta de color amarillo indica que no se ha detectado nigun movimiento tal y como se puede ver en la imagen:

Luego, si nos movemos algo, veremos que la imagen en la camara nos muestra una estela de color rojo indicando la trayectoria del movimiento asi como el boton tambien cambiara a dicho color especificando que ha ocurrido algun cambio en la imagen:

y si tenemos el volumen alto de nuestros altavoces o parlantes escucharemos el sonido de la sirena indicando que ha ocurrido un movimiento.

Eso es todo amigos, espero que este tutorial les sirva de referencia o sea de utilidad. Hasta pronto…

Si deseas descargar este programa puedes hacer click en el siguiente enlace:  Descargar Aplicacion

Anuncios

35 respuestas a “Deteccion de Movimiento con Vb.net y WebCam

  1. hola que tal al intentar compilar el programa me dice que puede ser dañino para el ordenador si se ejecuta el codigo que contiene tu programa
    asi que no se que hacer ,es de fiar el codigo?

    • Pues bueno mi intencion es la de compartir el conocimiento no de insertar codigo malicioso alguno en los programas u hacer daño, la aplicacion es 100 % segura, si no desas compilarlo puedes bajarte la libreria de AForge.Net y hacer todos los pasos que explico en el tutorial, a lo mejor es el antivirus o windows defender que ante algun nuevo programa te solicita permiso para ejecutar, el programa lo he testeado en varios pc y todo anda bien, pero te aseguro que la alerta que te aparece no hace referencia a nada grave, ejecutalo bajo tu propio riesgo y consentimiento…

  2. Hola, todo funciona excelente muchas gracias.
    Ahora tengo el sgte. problema espero que me puedas ayudar.
    Quiero dejar encendida la compu y que grabe cuando haya algun movimiento para poder revisarlo otro día

    • Hola, en cuanto a tu problema te puedo decir lo siguiente:
      Para dejar tu pc encendido y que capture imagenes y las guarde “si hay movimiento” lo que debes hacer solo es tener una variable indicadora que se coloque en un estado especifico si detecto movimiento, luego cuando haya el movimiento, capturas algunas imagenes por unos 5 segundos y las almacenas en alguna carpeta colocandole la fecha y hora en que ocurrio el evento, esa es la manera mas facil, pero si lo que quieres es que te grabe “video” cuando haya movimiento ya debes usar alguna libreria que te permita convertir una secuencia de imagenes en un flujo mpeg o avi y para ese proceso deberias de manejar algo de DirectShow una libreria especializada para procesar archivos multimedias.
      Bueno espero y te sea util mi comentario y puedas resolver tu problema.
      Saludos!

      • Se me ocurre que en el evento NewFrame se haga uso de la clase VideoFileWriter

        Ejemplo:

        //variable para cuando se detecte el movimiento
        //activa la grabación de video.
        bool motiondetected = false;
        //alto y ancho del video
        int height = 480;
        int width = 640;
        //cantidad de frames por segundos
        int framerate = 25;
        // crea instancia
        VideoFileWriter writer = new VideoFileWriter( );
        // crea nuevo archivo de video
        writer.Open( “test.avi”, width, height, framerate, VideoCodec.MPEG4 );

        .
        .
        .
        private void _NewFrameEventHandler( object sender, AForge.Video.NewFrameEventArgs e)
        {
        if( motiondetected)
        {
        //Escribe el nuevo frame en el video
        writer.WriteVideoFrame( e.Frame );
        }

        }

  3. Muy Bueno tu aporte, me ha sido de gran ayuda. Una consulta, como puedo hacer para obtener las coordenadas de el movimiento detectado y traducirlo en movimientos del mouse?, gracias!!

  4. Muy bueno el tutorial, es de ayuda. Tengo una consulta, si con esas mismas librerias puedo hacer un proyecto de verificacion facial… me ayudarias mucho si tuvieras un ejemplo de verificacion facial ?? thanks por la ayuda !!!

  5. Hola amigo! muchas gracias por tu post! realmente es lo que estaba buscando. El problema que tengo es que al compilar, me figura el siguiente error:
    “Error 1 El ensamblado ‘AForge.Controls, Version=2.2.4.0, Culture=neutral, PublicKeyToken=a8ac264d1dc6b9d9’ utiliza ‘AForge.Video, Version=2.2.4.0, Culture=neutral, PublicKeyToken=cbfb6e07d173c401’ que tiene una versión superior a la del ensamblado ‘AForge.Video, Version=2.1.5.0, Culture=neutral, PublicKeyToken=cbfb6e07d173c401’ al que se hace referencia E:\DropBox\Dropbox\Software de prueba de la incubadora\Incubadora\Incubadora\bin\Debug\AForge.Controls.dll Incubadora

    Ya quité y volví a agregar la referencia al AForge.Controls.dll

    Si me podés dar una mano te lo agradezco!!
    Saludos!

  6. Hola me podrias ayudar es que soy un poco nuevo en esto y en la parte donde dice webcam.Image = Imagen me muestra error me dice que no esta declarado muchas gracias por la ayuda

    • Hola compañero, ya pude ver las imágenes y estuve probando el programa en visual studio 2010, le encontré cierto detalle que no dejaba ejecutar el programa y era que estaba cambiando las propiedades del botón que indica si hay o no movimiento a través de un subproceso, para solucionarlo coloque la siguiente línea de código en el evento load del formulario:

      CheckForIllegalCrossThreadCalls = False 

      lo que significa que desactivara los errores por subproceso que se puedan generar.

      Con respecto al error que te aparece en la línea de código:

       webcam.Image = Imagen 

      creo que no haz importado correctamente las librerías al proyecto o no estas usando el control adecuado para ver la fuente de video el cual es: VideoSourcePlayer, a mi me funciona correctamente el programa y solo le hice la corrección de lo del error de subproceso colocando la línea de código en el evento load que te indique arriba para desactivar dicho error por subproceso.

      Te recomiendo que verifiques en el explorador de soluciones que tengas todas las librerías del paquete AForge asi como hagas referencia a ellas en los import del proyecto o vuelve a descargar el proyecto y ejecuta primero el ejecutable de la carpeta debug para ver si te funciona bien.

      Saludos!

      • Amigo yo pase todo a c# y me marca el mismo error
        – webcam.Image = Imagen
        Ya revise las referencias y todo, pero no encuentro que otra cosa pueda ser.

  7. Amigo muchas gracias por este aporte inmenso, me ayudaste con un proyecto, full gracias.

    Pero tengo una pregunta, ¿como haría si quiero que al presionar “detener” se detenga la alarma?, ya que la única manera de detenerlo es cerrando el formulario.

    gracias de antemano.

  8. Veo que este tema es un tanto antiguo, pero ando precisamente buscando una solución. Aplique las rutinas que aquí se describen y me detecta la cámara del notebook pero no la cámara IP que es una Wanscam. Que me podría estar faltando?

    • Lo que sucede es que el programa solo detecta las cámaras conectadas físicamente a través de un cable al PC, tal vez al intentar conectar tu cámara a través de de wifi no es posible que te la reconozca.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s