¿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! :)
Los gráficos de torta, también llamados gráficos de 360 grados o circulares, son gráficos estadísticos que se utilizan p...
En este tutorial nos conectaremos a una base de datos de Firebird utilizando el lenguaje de Visual Basic, el proyecto se...
Para agregar imágenes a un JComboBox, partiremos de un proyecto Netbeans con la siguiente estructura: Tenemos dos clases...
El Método Congruencial Lineal Mixto es el más utilizado en simulación en computadoras digitales y esta basado en una rel...
TextToSpeech o TTS, es el sintetizador de voz para android, en los celulares inteligentes viene un motor TTS por defecto...
A continuación tenemos una clase que nos permite arrastrar un archivo de Excel (*.xlsx) y cargar su contenido en una tab...
Los comentarios estan cerrados
Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...
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