Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Public Class Form1
- 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
- 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
- Dim iDevice As Integer = 0
- Dim hHwnd As Integer
- Dim last As Bitmap
- Dim starting As Boolean = True
- Dim thread As System.Threading.Thread
- Dim percent As Double
- Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, 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
- 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 Integer = 0
- Do
- bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
- If bReturn Then lstDevices.Items.Add(strName.Trim)
- x += 1
- Loop Until bReturn = False
- End Sub
- Private Sub OpenPreviewWindow()
- Dim iHeight As Integer = picCapture.Height
- Dim iWidth As Integer = picCapture.Width
- hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCapture.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, picCapture.Width, picCapture.Height, SWP_NOMOVE Or SWP_NOZORDER)
- btnSave.Enabled = True
- btnstop.Enabled = True
- btnstart.Enabled = False
- Else
- DestroyWindow(hHwnd)
- btnSave.Enabled = False
- End If
- 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 Image
- SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
- data = Clipboard.GetDataObject()
- If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
- bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image)
- picCapture.Image = bmap
- ClosePreviewWindow()
- btnSave.Enabled = False
- btnstop.Enabled = False
- btnstart.Enabled = True
- End If
- End Sub
- Private Sub ClosePreviewWindow()
- SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
- DestroyWindow(hHwnd)
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- LoadDeviceList()
- Me.CheckForIllegalCrossThreadCalls = False
- End Sub
- Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
- OpenPreviewWindow()
- btnStart.Enabled = False
- btnStop.Enabled = True
- End Sub
- Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
- ClosePreviewWindow()
- btnStart.Enabled = True
- btnStop.Enabled = False
- End Sub
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- 'checking the image
- 'define data to collect the image from the webcam
- Dim data As IDataObject
- 'define bmap to contain the bitmap that comes from
- 'the webcam
- Dim bmap As Bitmap
- 'The first time the timer runs we need to set everything up
- 'or we will get errors
- If starting Then ' if this is the first time we have run the code
- OpenPreviewWindow() ' start the preveiw window
- 'get the first image
- SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
- data = Clipboard.GetDataObject()
- 'if the image is there then save it to last
- 'which is a global variable that stores the last image for comparison
- If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
- last = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image)
- End If
- 'set the start variable to false so that we start the comparing next run of the timer
- starting = False
- Else
- 'This is at least our second run so we can
- 'compare
- 'We get another image from the webcam
- SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
- data = Clipboard.GetDataObject()
- 'if we recive an image from the webcam then:
- If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
- 'get the image data
- bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
- 'calculate the percentage of pixels the same
- Dim total As Integer
- Dim number As Integer = 0
- Dim absolutle As Integer = 0
- Dim a, b As Integer 'to store the color value for the calulation
- 'set total to the size of the image
- total = (bmap.Width) * (bmap.Height)
- For i = 0 To bmap.Height - 1
- For n = 0 To bmap.Width - 1
- absolutle += 1
- 'each pixle
- 'each color
- a = bmap.GetPixel(n, i).R
- b = last.GetPixel(n, i).R
- If (a - b) ^ 2 < 100 Then
- a = bmap.GetPixel(n, i).G
- b = last.GetPixel(n, i).G
- If (a - b) ^ 2 < 100 Then
- a = bmap.GetPixel(n, i).B
- b = last.GetPixel(n, i).B
- If (a - b) ^ 2 < 100 Then
- number += 1
- End If
- End If
- End If
- Next
- Next
- Label1.Text = number & "/" & total & " : " & FormatPercent(number / total) & " Absolute : " & absolutle
- percent = number / total
- If percent < 0.7 Then
- thread = New System.Threading.Thread(AddressOf Speak)
- thread.Start()
- End If
- last = bmap
- End If
- End If
- End Sub
- Public Sub Speak()
- Dim SAPI
- SAPI = CreateObject("SAPI.spvoice")
- SAPI.Speak("Intruder alert.")
- End Sub
- End Class
Advertisement
Add Comment
Please, Sign In to add comment