How to capture and save pictures to a folder using a webcam in VB.Net Complete Source Code
Having a way to capture and save pictures is a great add on in any software. For example if you are building a Clinic Management System or HR System it would be nice to capture Patient Photos or Employee Photos using your webcam instead of using a separate camera or scanning passport photos.
In this tutorial I am going to show you how to capture and save pictures to a folder using a webcam in VB.Net.
Image may be NSFW.
Clik here to view.
Requirements
As you have probably guessed, you will need a webcam for this. If you are using a Laptop with a webcam that will be perfect. The other thing you will need is a Visual Studio IDE. For this tutorial I will be using Visual Studio 2010. And lastly a DLL Library known as avicap2.dll
- Webcam
- Visual Studio IDE
- AviCap32.dll
AviCap32.dll
The module avicap32.dll is an Audio-Video Interleaved (AVI) Video Capture dynamic link library registered under Microsoft Corporation. It is developed by Microsoft to be part of its Windows operating system. So there is no need of any downloads.
A very common function of the avicap32.dll module is to enable Windows to capture movies and video images from cameras like digital cameras, web cameras, video cards and other video hardware. Furthermore, the avicap32.dll application stores the resulting video as AVI format. The AVI format is the most common format defined by Windows for audio and video data on a computer. Basically, when a user records a video or is using a webcam for video conferencing, the video capturing process takes place. Read more about avicap32.dll here
How to capture and save pictures to a folder using a webcam in VB.Net
Enough with the stories. Now lets get to work.
- Open your Visual Studio IDE – Go to File and click New Project
Image may be NSFW.
Clik here to view.
- Choose Window Form Application – Enter the name of your project and click ok.
Image may be NSFW.
Clik here to view.
- Form Design
This application will list all the webcam devices available a List Box (lstDevices). The capture video from the webcam will be displayed on a Picture Box (picCapture). 4 buttons have been used (btnStart, btnStop, btnSave, btnInfo) and a Save File Dialog(sfdImage). Design your form as described it should look similar to what I have.
Image may be NSFW.
Clik here to view.
- Form Code
Now it is time to give some logic to our Form. Copy and paste the below code to your Form and run the program
Option Explicit On Imports System.Runtime.InteropServices Public Class frmCapturePictureWebCam Const WM_CAP As Short = &H400S Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10 Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11 Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30 Public Const WM_CAP_GET_STATUS As Integer = WM_CAP + 54 Public Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP + 41 Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50 Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52 Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53 Const WS_CHILD As Integer = &H40000000 Const WS_VISIBLE As Integer = &H10000000 Const SWP_NOMOVE As Short = &H2S Const SWP_NOSIZE As Short = 1 Const SWP_NOZORDER As Short = &H4S Const HWND_BOTTOM As Short = 1 Private DeviceID As Integer = 0 ' Current device ID Private hHwnd As Integer ' Handle to preview window Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _ ByRef lParam As CAPSTATUS) As Boolean Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Boolean, _ ByRef lParam As Integer) As Boolean Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _ ByRef lParam As Integer) As Boolean 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 Structure POINTAPI Dim x As Integer Dim y As Integer End Structure Public Structure CAPSTATUS Dim uiImageWidth As Integer '// Width of the image Dim uiImageHeight As Integer '// Height of the image Dim fLiveWindow As Integer '// Now Previewing video? Dim fOverlayWindow As Integer '// Now Overlaying video? Dim fScale As Integer '// Scale image to client? Dim ptScroll As POINTAPI '// Scroll position Dim fUsingDefaultPalette As Integer '// Using default driver palette? Dim fAudioHardware As Integer '// Audio hardware present? Dim fCapFileExists As Integer '// Does capture file exist? Dim dwCurrentVideoFrame As Integer '// # of video frames cap'td Dim dwCurrentVideoFramesDropped As Integer '// # of video frames dropped Dim dwCurrentWaveSamples As Integer '// # of wave samples cap'td Dim dwCurrentTimeElapsedMS As Integer '// Elapsed capture duration Dim hPalCurrent As Integer '// Current palette in use Dim fCapturingNow As Integer '// Capture in progress? Dim dwReturn As Integer '// Error value after any operation Dim wNumVideoAllocated As Integer '// Actual number of video buffers Dim wNumAudioAllocated As Integer '// Actual number of audio buffers End Structure 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 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 Private Sub LoadDeviceList() Dim strName As String = Space(100) Dim strVer As String = Space(100) Dim bReturn As Boolean Dim x As Short = 0 ' ' Load name of all avialable devices into the lstDevices ' Do ' ' Get Driver name and version ' bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100) ' ' If there was a device add device name to the list ' If bReturn Then lstDevices.Items.Add(strName.Trim) x += CType(1, Short) Loop Until bReturn = False End Sub Private Sub OpenPreviewWindow() Dim iHeight As Integer = picCapture.Height Dim iWidth As Integer = picCapture.Width ' ' Open Preview window in picturebox ' hHwnd = capCreateCaptureWindowA(DeviceID.ToString, WS_VISIBLE Or WS_CHILD, 0, 0, 1280, _ 1024, picCapture.Handle.ToInt32, 0) ' ' Connect to device ' If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, DeviceID, 0) Then ' 'Set the preview scale ' SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0) ' 'Set the preview rate in milliseconds ' SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0) ' 'Start previewing the image from the camera ' SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0) ' ' Resize window to fit in picturebox ' SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, _ SWP_NOMOVE Or SWP_NOZORDER) btnSave.Enabled = True btnStop.Enabled = True btnStart.Enabled = False btnInfo.Enabled = True Else ' ' Error connecting to device close window ' DestroyWindow(hHwnd) btnSave.Enabled = False End If End Sub Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click DeviceID = lstDevices.SelectedIndex OpenPreviewWindow() Dim bReturn As Boolean Dim s As CAPSTATUS bReturn = SendMessage(hHwnd, WM_CAP_GET_STATUS, Marshal.SizeOf(s), s) Debug.WriteLine(String.Format("Video Size {0} x {1}", s.uiImageWidth, s.uiImageHeight)) End Sub Private Sub ClosePreviewWindow() ' ' Disconnect from device ' SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, DeviceID, 0) ' ' close window ' DestroyWindow(hHwnd) End Sub Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click ClosePreviewWindow() btnSave.Enabled = False btnStart.Enabled = True btnInfo.Enabled = False btnStop.Enabled = False End Sub Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click Dim data As IDataObject Dim bmap As Bitmap ' ' Copy image to clipboard ' SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0) ' ' Get image from clipboard and convert it to a bitmap ' data = Clipboard.GetDataObject() If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap) picCapture.Image = bmap ClosePreviewWindow() btnSave.Enabled = False btnStop.Enabled = False btnStart.Enabled = True btnInfo.Enabled = False Trace.Assert(Not (bmap Is Nothing)) If sfdImage.ShowDialog = DialogResult.OK Then bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp) End If End If End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing If btnStop.Enabled Then ClosePreviewWindow() End If End Sub Private Sub btnInfo_Click(sender As System.Object, e As System.EventArgs) Handles btnInfo.Click ' SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&) SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, True, 0) End Sub Private Sub Form1_Load_1(sender As System.Object, e As System.EventArgs) Handles MyBase.Load LoadDeviceList() If lstDevices.Items.Count > 0 Then btnStart.Enabled = True lstDevices.SelectedIndex = 0 btnStart.Enabled = True Else lstDevices.Items.Add("No Capture Device") btnStart.Enabled = False End If Me.AutoScrollMinSize = New Size(100, 100) btnStop.Enabled = False btnSave.Enabled = False btnInfo.Enabled = False picCapture.SizeMode = PictureBoxSizeMode.StretchImage End Sub End Class
This code is available in several places online and I am not very sure of the original source. For this article I have referenced this article from vb-tip.com
The post How to capture and save pictures to a folder using a webcam in VB.Net appeared first on Smart Tech Diary.