VB .NET - Usando a WebCam (revisitado) |
Neste artigo vou mostrar, mais uma vez, como usar os recursos da WebCam em uma aplicação Windows Forms usando a linguagem VB .NET. |
Este é mais um projeto que usa os recursos de uma webcam em um projeto Windows Forms.
Nele podemos selecionar as câmeras disponíveis ativando-as para poder capturar imagens.
No projeto temos também um exemplo de como tocar arquivos .wav usando os recursos do namespace My.
O projeto irá usar as APIs do Windows para efetuar a captura de vídeo. A DLL avicap32.dll possui funções para conexão e obtenção de dispositivos de vídeos instalados no sistema Windows.
As funções usadas serão as seguintes :
a-
capCreateCaptureWindowA
b- capGetDriverDescriptionA
c- SendMessage
d- SetWindowPos
e- DestroyWindow
Veja também a colaboração : VB - Usando uma Webcam. para obter detalhes das APIs usadas. |
Assim, esse é mais um exemplo para captura de imagens de uma WebCam usando a linguagem VB .NET; veja a versão para o VB6 no link: VB6 - Capturando imagens de uma WebCam.
Nota : O exemplo foi testado na Microsoft Web Cam.
Recursos usados :
Criando o projeto no VS Community
Abra o VS Community 2015 e clique em New Project;
A seguir selecione Visual Basic -> Windows -> Windows Forms Application;
Informe o nome Vbn_WebCam e clique no botão OK;
Altere as seguintes propriedades deste formulário:
Vamos agora definir a interface passo a passo:
1 - A partir da ToolBox inclua os seguintes controles no formulário form1.vb:
Disponha os controles no formulário conforme o leiaute abaixo:
Defina no formulário form1.vb as seguintes variáveis que serão visualizadas em todo o formulário:
Dim ImagemOriginal As BitmapVamos incluir um novo módulo no projeto via menu Project -> Add Module com o nome CaptureMod.vb com o seguinte código:
Imports System.Runtime.InteropServices
Module CaptureMod
Public Const WM_CAP As Short = &H400S
Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
Public Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
Public Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Public Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
Public Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
Public Const WS_CHILD As Integer = &H40000000
Public Const WS_VISIBLE As Integer = &H10000000
Public Const SWP_NOMOVE As Short = &H2S
Public Const SWP_NOSIZE As Short = 1
Public Const SWP_NOZORDER As Short = &H4S
Public Const HWND_BOTTOM As Short = 1
Public iDevice As Integer = 0
Public hHwnd As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
<MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, _
ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, _
ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" _
(ByVal lpszWindowName As String, ByVal dwStyle As Integer, _
ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, _
ByVal nHeight As Short, ByVal hWndParent As Integer, _
ByVal nID As Integer) As Integer
Public Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _
ByVal cbVer As Integer) As Boolean
End Module
|
Neste módulo usamos o namespace System.Runtime.InteropServices e definimos algumas funções onde usamos algumas APIs do Windows para realizar a captura da imagem da WebCam e realizar tarefas básicas.
Agora inclua no evento Load do formulário o código abaixo:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
If WindowState = 2 Then WindowState = 0
CarregaListaDispositivo()
If My.Computer.FileSystem.FileExists(GetSetting("WebCam", "Settings", "CaminhoAviso")) Then
ofd1.FileName = GetSetting("WebCam", "Settings", "CaminhoAviso")
End If
If My.Computer.FileSystem.DirectoryExists(GetSetting("WebCam", "Settings", "CaminhoImagem")) Then
fbd1.SelectedPath = GetSetting("WebCam", "Settings", "CaminhoImagem")
End If
Catch ex As Exception
Throw ex
End Try
End Sub
|
Neste código chamamos o método CarregaListaDispositivo() que exibe as webcam disponíveis e a seguir recuperamos do arquivo de registro do sistema informações sobre a pasta onde a imagem capturada será salva.
O código o método CarregaListaDispositivo() é visto abaixo:
Private Sub CarregaListaDispositivo()
Dim strName As String = Space(100)
Dim strVer As String = Space(100)
Dim bReturn As Boolean
Dim x As Integer = 0
cboCameras.Items.Clear()
Do
bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
If bReturn Then cboCameras.Items.Add(strName.Trim)
x += 1
Loop Until bReturn = False
If cboCameras.Items.Count > 0 Then
cboCameras.SelectedIndex = 0
Else
MsgBox("Nenhum dispositivo Encontrado.", 48)
End If
End Sub
|
Neste código usamos a API capGetDriverDescriptionA() para obter as webcam instaladas preenchendo o nome na combobox - cboCameras.
A seguir temos o código do evento Click do botão Iniciar que inicializa o serviço da webcam selecionada e ativa o botão de comando - Habilitar Câmera:
Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click If btnIniciar.Text = "Iniciar" Then iDevice = cboCameras.SelectedIndex AbrirJanelaVisualizacao() cboCameras.Enabled = False btnHabilitarSeguranca.Enabled = True btnIniciar.Text = "Parar" Else btnHabilitarSeguranca.Enabled = False FecharJanelaVisualizacao() cboCameras.Enabled = True btnIniciar.Text = "Iniciar" End If End Sub |
O código do método AbrirJanelaVisualizacao() é o seguinte:
Private Sub AbrirJanelaVisualizacao() Try Dim iHeight As Integer = picCaptura.Height Dim iWidth As Integer = picCaptura.Width hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCaptura.Handle.ToInt32, 0) If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0) SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0) SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0) SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCaptura.Width, picCaptura.Height, SWP_NOMOVE Or SWP_NOZORDER) Else DestroyWindow(hHwnd) End If Catch ex As Exception Throw ex End Try End Sub |
Este código exibe a imagem da webcam no controle PictureBox do formulário.
Para fechar a janela de visualização usamos o método FecharJanelaVisualizacao() a seguir:
Private Sub FecharJanelaVisualizacao() Try SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0) DestroyWindow(hHwnd) Catch ex As Exception Throw ex End Try End Sub |
Este código desconecta o serviço da webcam.
No evento CLick do botão - Habilitar Câmera - temos o código abaixo:
Private Sub btnHabilitarSeguranca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHabilitarSeguranca.Click If btnHabilitarSeguranca.Text.Contains("Habilitar") Then ImagemOriginal = CapturarImagem() habilitaCamara = True btnHabilitarSeguranca.Text = "Desabilitar Câmera" Else habilitaCamara = False Try ImagemOriginal.Dispose() ImagemOriginal = Nothing Catch End Try btnHabilitarSeguranca.Text = "Habilitar Câmera" End If End Sub |
Neste código capturamos a imagem da webcam e/ou liberamos os recursos usados conforme o status do botão para habilitar ou desabilitar a câmera.
A seguir temos o código do método CapturarImagem() que captura a imagem da webcam:
Private Function CapturarImagem() As Bitmap Dim data As IDataObject Dim Imagem As Bitmap = Nothing SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0) data = Clipboard.GetDataObject() If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then Imagem = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image) End If Return Imagem End Function |
Finalmente temos o código associado aos botões de comando : Escolher Música e Definir Pasta :
Private Sub btnProcurarSom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurarSom.Click If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then SaveSetting("WebCam", "Settings", "CaminhoAviso", ofd1.FileName) Try If chkTocarSom.Checked And ofd1.FileName IsNot Nothing Then My.Computer.Audio.Play(ofd1.FileName, AudioPlayMode.BackgroundLoop) End If Catch End Try End If End Sub Private Sub btnProcurarImagem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurarImagem.Click If fbd1.ShowDialog = Windows.Forms.DialogResult.OK Then Dim ImagemTeste As Bitmap = CapturarImagem() SaveSetting("WebCam", "Settings", "CaminhoImagem", fbd1.SelectedPath) Try If chkPegaImagem.Checked And habilitaCamara Then ImagemTeste.Save(fbd1.SelectedPath + "\" + CStr(Now.Ticks) + ".jpg", Imaging.ImageFormat.Jpeg) End If Catch Throw End Try End If End Sub |
Podemos selecionar um arquivo .wav para tocar como música de fundo e definir a pasta para salvar a imagem capturada da webcam.
Executando o projeto iremos obter o seguinte resultado:
Você pode adaptar o projeto e usá-lo no seu módulo de cadastro de clientes para obter a foto do cliente via webcam.
Pegue o projeto completo aqui : WebCam_VBNET.zip
Porque
não vos fizemos saber a virtude e a vinda de nosso Senhor Jesus Cristo, seguindo
fábulas artificialmente compostas; mas nós mesmos vimos a sua majestade.
2 Pedro 1:16
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET