Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / .Net / Proyectos / Visual Basic / Capturar webcam con VB.NET

Capturar webcam con VB.NET

Autor jc mouse viernes, mayo 11, 2012

¿Que haremos?

Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento.

¿Porque lo haremos?

Porque es justo y necesario 😉

¿Que necesitamos?

  • Visual Studio 2008 o Superior
  • Webcam (Yo utilizo una Delux)
  • Conocimientos intermedios sobre Visual Basic
  • Un repaso sobre las librerías de windows, prepárese para sufrir
  • Si aún te falta un poquito sobre las DLL, lee al GUILLE
  • Framework .NET 3.5 o superior
Comencemos 🙂
1. Crea un nuevo proyecto en VS, añade una nueva clase (WebCam.vb), al Form1 que te crea por defecto, añade tres botones, un PictureBox y un Timer como muestra la siguiente imagen:
GUI VB FORM
2. La clase WebCam.vb, es la encargada de realizar todo el trabajo, esta importará librerías DLL propias de Windows, ademas implementa funciones para comenzar el dispositivo, detenerlo y también una función para capturar frames y colocarlas en un picturebox
Imports System.Runtime.InteropServices

Public Class WebCam

    Dim CapHwnd As Integer
    'Tamaño de la ventana del webcam
    Dim Ancho As Integer = 320
    Dim Alto As Integer = 240

    '"libreria.DLL" = El nombre del API que se desea importar
    ' EntryPoint = indica el nombre exacto de la función del API que queremos usar
#Region "Librerias DLL"
    'La función SendMessage llama al procedimiento de ventana para la ventana especificada y no vuelve hasta que el procedimiento de ventana se ha procesado el mensaje
    'LRESULT SendMessage(
    'HWND hWnd, // handle of destination window
    'UINT Msg, // message to send
    'WPARAM wParam, // first message parameter
    'LPARAM lParam // second message parameter
    ');
    <DllImport("user32.dll", EntryPoint:="SendMessage")> _
    Public Shared Function SendMessage(ByVal hWnd As Integer, ByVal Msg As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    'Crea una ventana de captura
    <DllImport("avicap32.dll", EntryPoint:="capCreateCaptureWindowA")> _
    Public Shared Function capCreateCaptureWindowA(ByVal Nombre As String, ByVal dwStyle As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWnd As Integer, ByVal nID As Integer) As Integer
    End Function

#End Region

#Region "Constantes API - no se que significan todas :)"
    Const WM_USER As Integer = 1024
    Const WM_CAP_CONNECT As Integer = 1034
    Const WM_CAP_DISCONNECT As Integer = 1035
    Const WM_CAP_GET_FRAME As Integer = 1084
    Const WM_CAP_COPY As Integer = 1054
    Const WM_CAP_START As Integer = WM_USER
    Const WM_CAP_SET_PREVIEWRATE As Integer = WM_USER + 52
    Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP_START + 41
    Const WM_CAP_DLG_VIDEOSOURCE As Integer = WM_CAP_START + 42
    Const WM_CAP_DLG_VIDEODISPLAY As Integer = WM_CAP_START + 43
    Const WM_CAP_GET_VIDEOFORMAT As Integer = WM_CAP_START + 44
    Const WM_CAP_SET_VIDEOFORMAT As Integer = WM_CAP_START + 45
    Const WM_CAP_DLG_VIDEOCOMPRESSION As Integer = WM_CAP_START + 46
    Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
#End Region

    'Captura frame y deposita en el portapapeles
    Public Sub timer_tick(ByVal picture As PictureBox)
        SendMessage(CapHwnd, WM_CAP_GET_FRAME, 0, 0)
        SendMessage(CapHwnd, WM_CAP_COPY, 0, 0)
        picture.Image = Clipboard.GetImage()
        Application.DoEvents()
    End Sub

    'guarda el frame que esta en memoria en un archivo JPG
    Public Sub Capturar(ByVal picture As PictureBox)
        Dim sfile_JPG As String = "e:\archivo.jpg"
        Dim obj_bitMap As New Bitmap(Ancho, Alto)
        Try
            picture.DrawToBitmap(obj_bitMap, New Rectangle(0, 0, Ancho, Alto))
            obj_bitMap.Save(sfile_JPG, Imaging.ImageFormat.Jpeg)
            MessageBox.Show("Imagen capturada en [" & sfile_JPG & " ]")
        Catch ex As Exception
            System.Console.WriteLine(ex)
        End Try
    End Sub

    Public Sub Iniciar(ByVal timer As Timer, ByVal padre As Form)
        Try
            'Configura la ventana de captura
            CapHwnd = capCreateCaptureWindowA("WebCam", 0, 0, 0, Ancho, Alto, padre.Handle.ToInt32(), 0)

            Application.DoEvents()

            SendMessage(CapHwnd, WM_CAP_CONNECT, 0, 0)
            SendMessage(CapHwnd, WM_CAP_SET_PREVIEWRATE, 69, 0)
            SendMessage(CapHwnd, WM_CAP_SET_PREVIEW, 0, 0)
            'se inicia el Timer
            timer.Start()
        Catch ex As Exception
            Console.WriteLine(ex)
        End Try
    End Sub

    Public Sub Detener(ByVal timer As Timer)
        Try
            timer.Stop()
            Application.DoEvents()
            SendMessage(CapHwnd, WM_CAP_DISCONNECT, 0, 0)
        Catch ex As Exception
            Console.WriteLine(ex)
        End Try
    End Sub

End Class
3. Debemos implementar la clase WebCam.vb y sus funciones en el Form1.vb, el código es:
Public Class Form1

    Dim webcam As New WebCam

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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        webcam.Iniciar(Timer1, Me)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        webcam.Detener(Timer1)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        webcam.Capturar(PictureBox1)
    End Sub

End Class
5. Terminamos, guardamos el proyecto, rezamos un poco y presionamos F5, lo del rezo es porque con windows nunca se sabe lo que puede pasar 🙂
Radeo Cam

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Construye tu swing Versus para el mundial 2014

Construye tu swing Versus para el mundial 2014

Para ponerse a tono con el ambiente mundialista de Brasil 2014, en este post construiremos un swing java al que llamarem...

Crea gráfico de barras Bar Chart

Crea gráfico de barras Bar Chart

Un gráfico de barras es una forma de resumir un conjunto de datos por categorías. Muestra los datos usando varias barras...

Dibujando con Canvas

Dibujando con Canvas

La clase Canvas (Lienzo)  de Android es una superficie que nos permite pintar figuras, texto e imágenes utilizando para...

Crea un servicio web REST con PHP y MYSQL -Parte 2

Crea un servicio web REST con PHP y MYSQL -Parte 2

Segunda parte del tutorial “Crea un servicio web REST con PHP y MYSQL“, en esta segunda y ultima parte se co...

Simulador de Urna Electrónica en java

Simulador de Urna Electrónica en java

Hola 🙂 en esta ocasión un amigo del Brasil nos envía un proyecto java de una Urna Electrónica o Voto Electronico, desarr...

Código de Control v7 en JavaScript

Código de Control v7 en JavaScript

En esta oportunidad, se deja a disposición de la comunidad de programadores de Bolivia y también porque no, del que quie...

20 comentarios en “Capturar webcam con VB.NET”

  1. cesar ramos dice:

    muy bueno, gracias.. 🙂
    perooo no funca en mi compu, aparece una pantalla verde al iniciar la camara, se puede solucionar este problema? gracias de todos modos

    1. Mouse dice:

      tal vez problema de driver 🙂

  2. Carlos dice:

    esa pantalla en verde significa que la camara ya esta siendo usada por algún otro programa; tendrías que cerrar todos los programas que usan la camara.
    salu2!

  3. german gomez dice:

    saludos estaba viendo tu aporte, cabe destacar que no funciona en Framework.NET 4

    1. Mouse dice:

      gracias por el aviso :=)

  4. Mario dice:

    la verdad es que no me funciona,toma una imagen en blanco y lo guarda en la unidad e,por favor me puedes decir que es lo que pasa…muchas gracias

    1. Mouse dice:

      por lo menos lo guarda 🙂 tiene que ver todo desde los driver el sistema operativo la version del framework, etc, tienes que ir descartando uno a uno hasta encontrar la solución, a mi me funciono a la primera 🙂

  5. Elvin Peralta dice:

    Me da un error. A first chance exception of type ‘System.Runtime.InteropServices.ExternalException’ occurred in System.Drawing.dll Espero me puedas ayudar. Saludos

    1. JUAN CARLOS AGUILAR dice:

      ese problema es por los parametros a la biblioteca y no puede dibujar la imagen
      checa bien los parametros que le mandas
      si funciona tu web cam ??
      checa el driver y el framework
      saludos espero y te sirva

  6. Fernando ME dice:

    Funciona vb.net a la perfección !!!!

  7. Fernando ME dice:

    OJO Primero coloquen el codigo así:

    Imports System.Runtime.InteropServices
    Public Class Form1

    Dim webcam As New WebCam

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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    webcam.Iniciar(Timer1, Me)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    webcam.Detener(Timer1)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    webcam.Capturar(PictureBox1)
    End Sub

    End Class

    Public Class WebCam

    Dim CapHwnd As Integer
    ‘Tamaño de la ventana del webcam
    Dim Ancho As Integer = 320
    Dim Alto As Integer = 240

    ‘”libreria.DLL” = El nombre del API que se desea importar
    ‘ EntryPoint = indica el nombre exacto de la función del API que queremos usar
    #Region “Librerias DLL”
    ‘La función SendMessage llama al procedimiento de ventana para la ventana especificada y no vuelve hasta que el procedimiento de ventana se ha procesado el mensaje
    ‘LRESULT SendMessage(
    ‘HWND hWnd, // handle of destination window
    ‘UINT Msg, // message to send
    ‘WPARAM wParam, // first message parameter
    ‘LPARAM lParam // second message parameter
    ‘);
    _
    Public Shared Function SendMessage(ByVal hWnd As Integer, ByVal Msg As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    ‘Crea una ventana de captura
    _
    Public Shared Function capCreateCaptureWindowA(ByVal Nombre As String, ByVal dwStyle As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWnd As Integer, ByVal nID As Integer) As Integer
    End Function

    #End Region

    #Region “Constantes API – no se que significan todas 🙂 ”
    Const WM_USER As Integer = 1024
    Const WM_CAP_CONNECT As Integer = 1034
    Const WM_CAP_DISCONNECT As Integer = 1035
    Const WM_CAP_GET_FRAME As Integer = 1084
    Const WM_CAP_COPY As Integer = 1054
    Const WM_CAP_START As Integer = WM_USER
    Const WM_CAP_SET_PREVIEWRATE As Integer = WM_USER + 52
    Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP_START + 41
    Const WM_CAP_DLG_VIDEOSOURCE As Integer = WM_CAP_START + 42
    Const WM_CAP_DLG_VIDEODISPLAY As Integer = WM_CAP_START + 43
    Const WM_CAP_GET_VIDEOFORMAT As Integer = WM_CAP_START + 44
    Const WM_CAP_SET_VIDEOFORMAT As Integer = WM_CAP_START + 45
    Const WM_CAP_DLG_VIDEOCOMPRESSION As Integer = WM_CAP_START + 46
    Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
    #End Region

    ‘Captura frame y deposita en el portapapeles
    Public Sub timer_tick(ByVal picture As PictureBox)
    SendMessage(CapHwnd, WM_CAP_GET_FRAME, 0, 0)
    SendMessage(CapHwnd, WM_CAP_COPY, 0, 0)
    picture.Image = Clipboard.GetImage()
    Application.DoEvents()
    End Sub

    ‘guarda el frame que esta en memoria en un archivo JPG
    Public Sub Capturar(ByVal picture As PictureBox)
    Dim sfile_JPG As String = “c:\FacturaQR.jpg”
    Dim obj_bitMap As New Bitmap(Ancho, Alto)
    Try
    picture.DrawToBitmap(obj_bitMap, New Rectangle(0, 0, Ancho, Alto))
    obj_bitMap.Save(sfile_JPG, Imaging.ImageFormat.Jpeg)
    MessageBox.Show(“Imagen capturada en [” & sfile_JPG & ” ]”)
    Catch ex As Exception
    System.Console.WriteLine(ex)
    End Try
    End Sub

    Public Sub Iniciar(ByVal timer As Timer, ByVal padre As Form)
    Try
    ‘Configura la ventana de captura
    CapHwnd = capCreateCaptureWindowA(“WebCam”, 0, 0, 0, Ancho, Alto, padre.Handle.ToInt32(), 0)

    Application.DoEvents()

    SendMessage(CapHwnd, WM_CAP_CONNECT, 0, 0)
    SendMessage(CapHwnd, WM_CAP_SET_PREVIEWRATE, 69, 0)
    SendMessage(CapHwnd, WM_CAP_SET_PREVIEW, 0, 0)
    ‘se inicia el Timer
    timer.Start()
    Catch ex As Exception
    Console.WriteLine(ex)
    End Try
    End Sub

    Public Sub Detener(ByVal timer As Timer)
    Try
    timer.Stop()
    Application.DoEvents()
    SendMessage(CapHwnd, WM_CAP_DISCONNECT, 0, 0)
    Catch ex As Exception
    Console.WriteLine(ex)
    End Try
    End Sub

    End Class

    Nota: se fue a debug de error, pero facíl de solucionar y por favor cambien la letra de la unidad donde lo van a guardar por ejemplo c:\

    Gracias por tu aportazo.

  8. elovan dice:

    Funciona!!!!! provado con visual studio 2012 express =), algun curso o libro bueno para visual basic?

  9. David Tarifa dice:

    Paso código con otra forma de guardar imagen a archivo, usando el API, no el pictureBox.

    Eso si, guarda en formato BMP, no en JPG, con lo que ocupa mas espacio.

    Public Sub GuardarFoto(ByVal nombreArchivo As String)

    SendMessageS(CapHwnd, WM_CAP_FILE_SAVEDIB, 0, nombreArchivo)

    End Sub

    Hay que declarar SendMessageS, (que es practicamente igual a SendMessage pero usa un string como último parámetro para el nombre del archivo.

    Declare Function SendMessageS Lib “user32” Alias “SendMessageA” _
    (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer _
    , ByVal lParam As String) As Integer

    Espero que os sea útil.

    Saludos!!

  10. Morkcop dice:

    Hola, muy bueno el aporte, lo he probado me funciono a la primera, pero luego de que lo dejo de ejecutar y lo vuelvo a ejecutar, ya no funciono mas, le doy click para iniciar la cam, me pregunta que cam quiero usar, que en la primera ves, no me pregunto y luego, en el picture, aparece la ultima imagen que tiene el portapapeles, pero no toma nuevas imagenes.- Porque sera? estoy utlizando framework 4.5 en visual basic 2012.-

    1. Javi dice:

      Hola a mi me pasa lo mismo pero sólo en equipos con W7 y 8 en XP funciona perfectamente, ¿lo has solucionado?

  11. Alex dice:

    Hola amigos le hice unos cambio xq quiero q se me guarde directamente en la BDD todo ok, pero al momento de cerrar o terminar esta no se cierra o se detiene se queda abierta, eh intentado de todo pero nada, ademas en ocasiones igualmente se pone verde la imagen…. Podrias ayudarme Gracias…!!!! Ecuador

  12. Pedro dice:

    A mi me funcionó con Win 7 Ultimate, Framework 4.5, pero se ve de cabeza. Alguna solución para dar vuelta la imagen?

    1. Carlos dice:

      Puse un tiempo de espera en la funcion INICIAR despues de optener el Hwnd

      Threading.Thread.Sleep(1000)

      Y todas las veces que inicie y pare me funciono en windws 10 con vb 2010

      Public Sub Iniciar(ByVal timer As Timer, ByVal padre As Form)
      Try
      ‘Configura la ventana de captura
      CapHwnd = capCreateCaptureWindowA(“WebCam”, 0, 0, 0, Ancho, Alto, padre.Handle.ToInt32(), 0)
      Threading.Thread.Sleep(1000)
      Application.DoEvents()

      SendMessage(CapHwnd, WM_CAP_CONNECT, 0, 0)
      SendMessage(CapHwnd, WM_CAP_SET_PREVIEWRATE, 69, 0)
      SendMessage(CapHwnd, WM_CAP_SET_PREVIEW, 0, 0)
      ‘se inicia el Timer
      timer.Start()
      Catch ex As Exception
      Console.WriteLine(ex)
      End Try
      End Sub

  13. JUAN PABLO HERRERA dice:

    Amigo lo que pasa es que le inicio a la camara la primera vez y despues de eso le detengo y trato de iniciarla de nuevo y se queda la camara congelada…. no se inicia

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Comparte lo que sabes

Categorias

Últimas entradas

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari...

El proyecto “Java Decompiler” tiene como objetivo desarrollar herramientas para descompilar y analizar byte...

En este post aprenderemos lo que es un JSON Web Token, como crear nuestro propio token de acceso y como usarlo en un Ser...

Android Bolivia

Bandera en Alto