¿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?
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
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
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! :)
En un post anterior, desarrollamos un swing para simular un efecto FLIP y recibí algunos mensajes pidiéndome un ejemplo...
Uno de los mayores problemas que se presenta en el desarrollo de una aplicación, es el acceso a la base de datos y el mé...
TextToSpeech o TTS, es el sintetizador de voz para android, en los celulares inteligentes viene un motor TTS por defecto...
Este post es la continuación del tutorial «Generador de código para Netbeans« en donde vimos como crear un modulo para N...
En este tutorial nos conectaremos a una base de datos de Firebird utilizando el lenguaje de Visual Basic, el proyecto se...
Java Printing nos permite hacer uso de las impresoras del sistema para, valga la redundancia 🙂 imprimir los gráficos de...
Los comentarios estan cerrados
El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...
WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...
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
tal vez problema de driver 🙂
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!
saludos estaba viendo tu aporte, cabe destacar que no funciona en Framework.NET 4
gracias por el aviso :=)
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
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 🙂
Me da un error. A first chance exception of type ‘System.Runtime.InteropServices.ExternalException’ occurred in System.Drawing.dll Espero me puedas ayudar. Saludos
o.O
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
Funciona vb.net a la perfección !!!!
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.
Funciona!!!!! provado con visual studio 2012 express =), algun curso o libro bueno para visual basic?
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!!
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.-
Hola a mi me pasa lo mismo pero sólo en equipos con W7 y 8 en XP funciona perfectamente, ¿lo has solucionado?
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
A mi me funcionó con Win 7 Ultimate, Framework 4.5, pero se ve de cabeza. Alguna solución para dar vuelta la imagen?
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
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