Interactuar Con Webcam y Base de datos

Hola amigos, en esta nueva ocasion he decidido elaborar una aplicacion que captura imagenes de la webcam y posteriormente la guarda en una base de datos en mysql en formato binario; la aplicacion que he desarrollado se encuentra en visual basic.net 2008 y el resultado final sera el que se observa en la siguiente imagen:

para empezar, creamos un nuevo proyecto de VB.Net y procememos a agregar la libreria encargada de interactuar con la webcam (webcam.dll la suministro en el proyecto); en la siguiente imagen se observa como se procede para agregar dicho componente.

le hacemos clic derecho a algun control del cuadro de herramientas y luego, en el menu desplegable que aparece escogemos la opcion elegir elementos, despues nos aparecera la siguiente ventana:

alli seleccionamos la pestaña que dice componentes de .Net Framework, y en la nueva ventana que aparece seleccionamos la carpeta debug del proyecto para adicionar el control webcam.dll, por ultimo se hace clic sobre el boton abrir para añadir el control

en esta imagen se puede observar el control ya agregado en la lista de herramientas de vb.net, ahora se puede proceder a insertarlo al formulario y a elaborar un diseño como el que se ve a continuacion:

como se puede observar, se agregan varios botones, varios textbox, varios labels, paneles, un picture box para mostrar la foto que se toma de la webcam y el control webcam para recibir la imagen directamente de la webcam.

Bien ahora hacemos las siguientes importaciones


Imports System.Data

'este espacio IO nos servirá para manipular los datos binarios

'a manera de stream (flujo)y se usa en las funciones bytes_image e image_bytes

Imports System.IO

ahora declaramos las siguientes variables como globales:

Dim img() As Byte
Dim cod_user As String
Dim indicador As Integer

listo, ahora si podemos pasar a programar los eventos de cada boton; comencemos con el boton activar webcam

Private Sub Button_activar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_activar.Click

Me.WebCam_panel.Start()

End Sub

el boton configuracion tendra lo siguiente:

Private Sub Button_config_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_config.Click

Me.WebCam_panel.Configuracion()

End Sub

el boton tomar foto tendra el siguiente codigo:

Private Sub Button_tfoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_tfoto.Click

Me.Picture_foto.Image = WebCam_panel.Imagen 'Pasa una imagen al PictureBox para ver la foto

End Sub

luego en el boton detener colocamos lo siguiente:

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

Me.WebCam_panel.Stop()

End Sub

bien, pasemos ahora a la programacion de los botones que permiten editar la foto tomada; dentro del boton voltear verticalmente ponemos:

Private Sub Button_vertical_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_vertical.Click

If Not Me.Picture_foto.Image Is Nothing Then

Me.Picture_foto.Image.RotateFlip(RotateFlipType.RotateNoneFlipY)

Me.Picture_foto.Refresh()

End If

End Sub

ahora dentro del boton voltear horizontalmente colocamos lo siguiente:

Private Sub Button_horizontal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_horizontal.Click

If Not Me.Picture_foto.Image Is Nothing Then

Me.Picture_foto.Image.RotateFlip(RotateFlipType.RotateNoneFlipX)

Me.Picture_foto.Refresh()

End If

End Sub

mas adelante, en el boton girar 90 grados colocamos el siguiente codigo:

Private Sub Button_90g_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_90g.Click

If Not Me.Picture_foto.Image Is Nothing Then

Me.Picture_foto.Image.RotateFlip(RotateFlipType.Rotate90FlipX)

Me.Picture_foto.Refresh()

End If

End Sub

dentro del boton girar 180 grados vamos a colocar el siguiente codigo:

Private Sub Button_180g_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_180g.Click

If Not Me.Picture_foto.Image Is Nothing Then

Me.Picture_foto.Image.RotateFlip(RotateFlipType.Rotate180FlipX)

Me.Picture_foto.Refresh()

End If

End Sub

ahora programamos las acciones que se ejecutaran al presionar el boton nuevo, para que se limpien las cajas de texto y se borre la foto que hallamos tomado,
lo que va dentro de dicho boton es lo siguiente:

Private Sub Button_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_nuevo.Click

Me.Text_id.Clear()

Me.Text_nombre.Clear()

Me.Text_apellido.Clear()

Me.Text_email.Clear()

Me.Picture_foto.Image = Nothing

End Sub

Bien, acontinuacion procedemos a agregar la referencia a la libreria de mysql para poder almacenar las imagenes en la base de datos; los pasos los podemos ver en la siguiente imagen:
hacemos clic sobre el menu proyecto y luego seleccionamos agregar referencia

mas a delante, en la ventana que aparece seleccionamos la pestaña examinar y alli nos dirigimos a la carpeta debug del proyecto para agregar la libreria mysql.data.dll que actua como conector con visual basic.net

luego de seleccionarla hacemos clic sobre el boton aceptar y queda agregada nuestra referencia.
ahora abrimos nuestro administrador de base de datos, en mi caso yo uso phpmyadmin de appserv y creamos una base datos.

como se puede observar en la imagen la base de datos tiene por nombre captura_datos_wc y la tabla que hemos creado tiene por nombre datos, en la imagen tambien se pueden observar los 6 campos que se han creado asi como el tipo de dato respectivo para cada uno.

ahora pasamos a nuestro proyecto de vb.net y añadimos otro import para hacer referencia a la libreria mysql.data.dll

Imports MySql.Data.MySqlClient

ahora añadimos un modulo desde donde se manejara todo lo relacionado a la conexion con la base de datos

ahora debemos colocar el siguiente codigo en nuestro modulo, deberia quedar de la siguiente manera:


Imports MySql.Data.MySqlClient

Module Modulo_conexion

   Public cadena As String

      Public conexion As New MySqlConnection

      Public sql As String

      Public mycommand As New MySqlCommand

      Public drusuario As MySqlDataReader

      Public myAdapter As New MySqlDataAdapter

          Sub establecer_conexion()

           Try

            cadena = "Server=localhost; user id=root; pwd=12345; database=captura_datos_wc;"

            conexion.ConnectionString = cadena

            conexion.Open()

            MsgBox("Conexion establecida!!!")

          Catch ex As Exception

           MsgBox(ex.Message)

          End Try

    End Sub

End Module

despues de ello nos dirigimos al evento load del formulario para llamar a la funcion establecer conexion y conectarse a la base de datos:

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

establecer_conexion()

End Sub

Bueno, ahora regresamos a nuestro formulario y crearemos las funciones encargardas de convertir la imagen en bytes y viceversa, para ello, inicialmente elaboraremos la funcion que convierte la imagen a bytes:

'convertir imagen a binario

Private Function Imagen_Bytes(ByVal Imagen As Image) As Byte()

   'si hay imagen

     If Not Imagen Is Nothing Then

     'variable de datos binarios en stream(flujo)

     Dim Bin As New MemoryStream

     'convertir a bytes

     Imagen.Save(Bin, Imaging.ImageFormat.Jpeg)

     'retorna binario

     Return Bin.GetBuffer

  Else

  Return Nothing

  End If

End Function

ahora creamos la funcion que convierte de bytes a imagen la cual sera utilizada para realizar las consultas y observar las imagenes guardadas

'convertir binario a imagen

Private Function Bytes_Imagen(ByVal Imagen As Byte()) As Image

 Try

   'si hay imagen

    If Not Imagen Is Nothing Then

    'caturar array con memorystream hacia Bin

     Dim Bin As New MemoryStream(Imagen)

    'con el método FroStream de Image obtenemos imagen

     Dim Resultado As Image = Image.FromStream(Bin)

     'y la retornamos

 Return Resultado

 Else

 Return Nothing

 End If

 Catch ex As Exception

 Return Nothing

 End Try

End Function

bueno, teniendo ya las funciones de operacion con la imagen a guardar y a consultar en la base datos, se puede proceder a programar el guardado de los datos, el procesos se realizara a traves del siguiente codigo:

Private Sub Button_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_guardar.Click

    Try
      sql = "SELECT id FROM datos"

      mycommand.Connection = conexion

      mycommand.CommandText = sql

   If conexion.State() = ConnectionState.Closed Then

     conexion.Open()

   End If

'---------------------------------------------------------------------

  'procedo a pasar los datos de los textbox a la variable para guardar

   mycommand.Parameters.Clear()

   mycommand.Parameters.AddWithValue("?iduser", Me.Text_id.Text.ToString)

   mycommand.Parameters.AddWithValue("?nombre", Me.Text_nombre.Text.Trim.ToString)

   mycommand.Parameters.AddWithValue("?apellido", Me.Text_apellido.Text.Trim.ToString)

   mycommand.Parameters.AddWithValue("?email", Me.Text_email.Text.Trim.ToString)

   img = Imagen_Bytes(Me.Picture_foto.Image)

   mycommand.Parameters.AddWithValue("?foto", img)

   mycommand.CommandText = "INSERT INTO datos values(NULL,?iduser,?nombre,?apellido,?email,?foto)"

  Try

   mycommand.ExecuteNonQuery()

   MsgBox("Registro Insertado con exito a la base de datos!...", MsgBoxStyle.Information, "Notificacion")

 Catch ex As Exception

   MsgBox("No es posible Guardar, Verifique! " & ex.Message, MsgBoxStyle.Critical, "Notificacion")

   End Try

   conexion.Close()

  Catch ex As Exception

  End Try
End Sub

a continuacion creamos una funcion o subrutina para realizar la busqueda de los usaurios registrados y proceder a traer la imagen:

Sub buscar_usuario()

  indicador = 0

  If conexion.State = ConnectionState.Closed Then

   conexion.Open()

  End If

  mycommand = New MySqlCommand("SELECT * FROM datos where id_usuario='" & cod_user & "'", conexion)

  mycommand.Connection = conexion

  Dim drusuario As MySqlDataReader

  drusuario = mycommand.ExecuteReader()

  Try

   Do While drusuario.Read

    indicador = 1

    Me.Text_id.Text = drusuario.GetString(1)

    Me.Text_nombre.Text = drusuario.GetString(2)

    Me.Text_apellido.Text = drusuario.GetString(3)

    Me.Text_email.Text = drusuario.GetString(4)

    Me.Picture_foto.Image = Bytes_Imagen(drusuario.GetValue(5))

    Exit Do

  Loop

 Catch ex As Exception

  MsgBox(ex.Message)

 End Try

 conexion.Close()
End Sub

ahora procedemos a llamar a la funcion buscar usuario dentro del boton buscar en bd tal y como se observa en el siguiente codigo:

Private Sub Button_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_buscar.Click

Try
   cod_user = InputBox("Escriba el id del usuario a buscar")

      If (cod_user.Trim <> "") Then

       'se ha digitado algun codigo, realizo la busqueda

       buscar_usuario()

      If (indicador = 0) Then

       MsgBox("El Usuario que Busca no se encuentra en la Base de datos, Verifique!", MsgBoxStyle.Exclamation, "Notificacion")

      End If

     End If
   Catch ex As Exception

 End Try
End Sub

por ultmo en el boton salir colocamos la instruccion:

 Me.Close()

para terminar la aplicacion, y tal y como les dije amigos pueden hacerle una prueba a la aplicacion y obtener un resultado similar al siguiente:

Desde el Siguiente link pueden bajar la aplicacion junto con las librerias utilizadas y el export de la base de datos en mysql para que la importen.

Descargar Aplicacion

Anuncios

47 respuestas a “Interactuar Con Webcam y Base de datos

  1. Alguna solución para esto:

    “An error ocurred while capturing the video image. The video capture will now be terminated.

    Referencia a objeto no establecida como instancia de una objeto”

  2. Tengo una camara china intra-oral camera tienes dos botones uno zoom y otro snap no se como controlarlos desde vb.net 2010. si tengo todo complato tomar fotos y todo pero desde el sistema. necesito detectar cuando pulso los botones fisicos de la camara alguien sabe como hacerlos. please gomez_felix@hotmail.com

    • Hola Walter, estuve probando el programa en visual studio 2010 ultimate y no le he encontrado ningun error, todo funciona bien, pero si en algun momento te aparece un mensaje como el siguiente:

      “Operación no válida a través de subprocesos: Se tuvo acceso al control desde un subproceso distinto a aquel en que lo creó”.

      Para solucionarlo coloca en el evento load del formulario la siguiente linea de codigo:

      CheckForIllegalCrossThreadCalls = False 
      

      Lo que hace es desactivar cualquier error que haya al trabajar con subprocesos.

      eso es todo, con esto te debe de correr bien el programa.

  3. una pregunta, php es gratuito? osea me refiero a que si hay que pagar alguna suma por el alojamiento de una base de datos, escuche algo al respecto.. gracias

    • Hola Cesar, tu pregunta se sale un poco de este tema, pero de todos modos te respondere: PHP es un lenguaje gratuito, lo puedes utilizar para desarrollar cualquier aplicacion web que desees, puedes instalar una aplicacion en un servidor local sin tener que hacer uso del internet, sin embargo por lo que tienes que pagar es por el servicio de hosting o alojamiento web que te presta alguna compañia que ofrezca esos servicios, es como un alquiler que te ofrecen por permitir que tu pagina aparezca en la web, aunque hay algunas empresas que brindan un alojamiento gratuito pero limitado el cual podria servir para realizar pruebas en el servidor y tener disponible algun servicio temporalmente en la web.

  4. Hola!! antes que nada gracias por el aporte!! me ayudo muchísimo con un proyecto que estoy desarrollando, pero tengo unas dudas!! espero me pueda ayudar!! primero cuando presiono el botón de guardar no me guarda la información en la base de datos, la base de datos la tengo en sql server 2008 (tengo un campo clave que es IDUsers el cua no lo utilizo en el form y es un campo auto incremento).

  5. hola amigo. Cuando ejecuto y presiono activar webcam me muestra una pantalla de origen de vídeo, y si le doy aceptar ó aplicar me muestra el siguiente error: ” A ocurrido un error en la captura del vídeo. Referencia a un objeto no establecida como instancia de un objeto”, presiono aceptar y no realiza ninguna acción más. me podrías hacer el inmenso favor y explicarme que pasa allí.

    Gracias amigo

  6. Quiero compartir unos datos que me facilitaron el proceso de esta aplicaciòn
    Ejecutar la camara web – WebCam1.Start()
    Configurar camara web – WebCam1.Configuracion()
    capturar la imagen cam – PictureBox1.Image = WebCam1.Imagen
    detener la cam – WebCam1.Stop() es màs facil

  7. AMIGO SUPER INTERESANTE TU PROYECTO LO ESTABA BUSCANDO
    UNA PREGUNTA SI PUEDO HACER ESTO CON SQL SERVER Y QUE TIPO DE DATOS ELEGIRIA?? DE ANTEMANO TE AGRADESCO Y DISCULPES MI IGNORANCIA

  8. Que tal, de ya agradezco el aporte, lo he probando pero de pronto me sale el siguiente mensaje: A ocurrido un error en la captura del video
    Un componente externo produjo una excepcion.
    Alguien tiene idea de que es lo que pueda estar ocurriendo.
    Agradeceré bastante alguna solución.

    • Hola Waly, pudiste resolver tu problema? a mi me sucede lo mismo pero no he podido resolver. Me gustaría saber si me puedes ayudar.

  9. Parece que el error solo se presenta algunas veces cuando lo ejecutas en tiempo de diseño, pero al ejecutarlo del mismo bin funciona bien.

  10. Buena la contribución, pero luego de un par de pruebas suele mostrar el error siguiente: A ocurrido un error en la captura del video. Un componente externo produjo una excepción. Alguien algun comentario al respecto.

  11. Como seria para guardar una imagen que tengo cargada directamente en el picturebox???
    Lo que pasa es que la estoy pintando con el metodo paint y quiero guardarla.

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