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 Bitmap
Dim habilitaCamara As Boolean = False

Vamos 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:


José Carlos Macoratti