|
|
![]() |
![]() |
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
|
|
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
![]()