#include #include #include #include OnAutoItExitRegister("_EXITLib") Opt("GUIONEVENTMODE", True) Global $avi, $user, $Startcap, $startwebcam, $Dirsv, $lastGetport, $listeDrivercapt Global $i = 0 Global $y = 0 Global $nb_snap = 0 Global $chrono = 0 Global $nb_preuve = 0 __Webcamini() _GDIPlus_Startup() $Dirsv = @ScriptDir & "\Webcam_Secutiry" If Not FileExists($Dirsv) Then DirCreate($Dirsv) $Dirsv = FileGetShortName($Dirsv) Global $Form1 = GUICreate("Form1", 473, 100) GUISetOnEvent(-3, "_EXIT") Global $Combo1 = GUICtrlCreateCombo("", 89, 8, 273, 25, 2097155) Global $Button1 = GUICtrlCreateButton("Start", 377, 6, 82, 25) GUICtrlSetOnEvent($Button1, "__Start") GUICtrlCreateLabel("Select camera", 14, 10, 72, 17) Global $Checkbox1 = GUICtrlCreateCheckbox("detecteur", 331, 37, 65, 17) GUICtrlSetOnEvent(-1, "checkbox") Global $button2 = GUICtrlCreateButton("Snap", 401, 37, 57, 17) GUICtrlSetOnEvent($button2, "snap") Global $Inputtext = GUICtrlCreateInput("moi", 14, 35, 297, 21) Global $lock = GUICtrlCreateButton("Afficher la webcam", 14, 60, 100, 21) GUICtrlSetOnEvent($lock, "__display") GUISetState() Global $Form2 = GUICreate("Form2", 455, 304) GUICtrlCreateGraphic(0, 0, 455, 304) GUICtrlSetColor(-1, 0x000000) $listeDrivercapt = __GetlisteDrivercapt() _Cheklist() __Start() Global $file_1 = snap2($Dirsv & "\image1.jpg") Global $file_2 AdlibRegister("snap3") Global $ini = 0 While 1 If IsChecked($Checkbox1) Then Local $ini = TimerInit() Local $file_2 = snap2($Dirsv & "\image2.jpg") Local $pourcentage = _ImageCompare($file_1, $file_2, 1) If $pourcentage > 3 Then If $chrono <= 0 Then AdlibUnRegister("snap3") AdlibRegister("snap") $ini = TimerInit() ConsoleWrite("Sound Started" & @CRLF) EndIf start_chrono() ConsoleWrite("mouvement" & @CRLF) $nb_preuve += 1 FileCopy($file_2, $Dirsv & "\preuve" & $nb_preuve & ".jpg", 1) EndIf FileCopy($file_2, $file_1, 1) If $chrono > 0 And $chrono < 20 Then $chrono -= TimerDiff($ini) / 1000 If $chrono < 0 Then AdlibUnRegister("snap") AdlibRegister("snap3", 100) ConsoleWrite("Sound End" & @CRLF) Else $ini = TimerInit() EndIf EndIf Else Sleep(1000) EndIf WEnd Func checkbox() If IsChecked($Checkbox1) Then $file_1 = snap2($Dirsv & "\image1.jpg") EndIf EndFunc ;==>checkbox Func IsChecked($iControlID) Return BitAND(GUICtrlRead($iControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>IsChecked Func _ImageCompare($filename1, $filename2, $precision) Local $nb_moyen = 0 Local $hImage1 = _GDIPlus_ImageLoadFromFile($filename1) Local $iW1 = _GDIPlus_ImageGetWidth($hImage1) Local $iH1 = _GDIPlus_ImageGetHeight($hImage1) Local $Reslt1 = _GDIPlus_BitmapLockBits($hImage1, 0, 0, $iW1, $iH1, $GDIP_ILMREAD, $GDIP_PXF32ARGB) Local $hImage2 = _GDIPlus_ImageLoadFromFile($filename2) Local $iW2 = _GDIPlus_ImageGetWidth($hImage2) Local $iH2 = _GDIPlus_ImageGetHeight($hImage2) Local $Reslt2 = _GDIPlus_BitmapLockBits($hImage2, 0, 0, $iW2, $iH2, $GDIP_ILMREAD, $GDIP_PXF32ARGB) Local $stride1 = DllStructGetData($Reslt1, "stride") Local $format1 = DllStructGetData($Reslt1, "format") Local $Scan01 = DllStructGetData($Reslt1, "Scan0") Local $stride2 = DllStructGetData($Reslt2, "stride") Local $format2 = DllStructGetData($Reslt2, "format") Local $Scan02 = DllStructGetData($Reslt2, "Scan0") Local $couleur1 Local $couleur2 Local $v_Buffer1 Local $v_Buffer2 For $i = 0 To $iW1 - 1 Step $precision For $j = 0 To $iH1 - 1 Step $precision $v_Buffer1 = DllStructCreate("dword", $Scan01 + ($j * $stride1) + ($i * 4)) $couleur1 = Hex(DllStructGetData($v_Buffer1, 1), 6) $v_Buffer2 = DllStructCreate("dword", $Scan02 + ($j * $stride2) + ($i * 4)) $couleur2 = Hex(DllStructGetData($v_Buffer2, 1), 6) $nb_moyen += _eval($couleur1, $couleur2) Next Next _GDIPlus_BitmapUnlockBits($hImage1, $Reslt1) _GDIPlus_ImageDispose($hImage1) _GDIPlus_BitmapUnlockBits($hImage2, $Reslt2) _GDIPlus_ImageDispose($hImage2) $nb_moyen = $nb_moyen / ($iW1 * $iH1) / ($precision * $precision) Return $nb_moyen EndFunc ;==>_ImageCompare Func _eval($result1, $result2) ;Extrait la couleur rouge en Hexa Local $rougehexa1 = StringLeft($result1, 2) ;Extrait la couleur verte en Hexa Local $verthexa1 = StringLeft(StringTrimLeft($result1, 2), 2) ;Extrait la couleur Bleu en Hexa Local $bleuhexa1 = StringRight($result1, 2) ;Convertit les hexadimales en décimales Local $rouge1 = Dec($rougehexa1) Local $vert1 = Dec($verthexa1) Local $bleu1 = Dec($bleuhexa1) ;Extrait la couleur rouge en Hexa Local $rougehexa2 = StringLeft($result2, 2) ;Extrait la couleur verte en Hexa Local $verthexa2 = StringLeft(StringTrimLeft($result2, 2), 2) ;Extrait la couleur Bleu en Hexa Local $bleuhexa2 = StringRight($result2, 2) ;Convertit les hexadimales en décimales Local $rouge2 = Dec($rougehexa2) Local $vert2 = Dec($verthexa2) Local $bleu2 = Dec($bleuhexa2) ;Fait la comparaison avec la difference (et passe les nombres negatifs en positifs) Local $soustractionrouge = Abs(StringReplace($rouge1 - $rouge2, "-", "")) Local $soustractionvert = Abs(StringReplace($vert1 - $vert2, "-", "")) Local $soustractionbleu = Abs(StringReplace($bleu1 - $bleu2, "-", "")) Return ($soustractionrouge + $soustractionvert + $soustractionbleu) / 3 EndFunc ;==>_eval Func snap3() If IsChecked($Checkbox1) Then AdlibUnRegister("snap3") EndIf __SenTobmpclip($startwebcam) __SaveImage("", 455, 304, GUICtrlRead($Inputtext), 0, 0, 20, "", $Form2) EndFunc ;==>snap3 Func snap2($place) __SenTobmpclip($startwebcam) __SaveImage("", 455, 304, GUICtrlRead($Inputtext), 0, 0, 20, $place, $Form2) Return $place EndFunc ;==>snap2 Func snap() $nb_snap += 1 Local $Sav = $Dirsv & "\Snap_" & $nb_snap & "_.jpg" __SenTobmpclip($startwebcam) __SaveImage("", 455, 304, GUICtrlRead($Inputtext) & @CRLF & _Date(), 0, 0, 20, $Sav, $Form2) ConsoleWrite("Snap" & @CRLF) EndFunc ;==>snap Func __display() Local $texte = GUICtrlRead($lock) Switch $texte Case "afficher la webcam" GUISetState(@SW_SHOW, $Form2) GUICtrlSetData($lock, "cacher la webcam") Case "cacher la webcam" GUISetState(@SW_HIDE, $Form2) GUICtrlSetData($lock, "afficher la webcam") EndSwitch EndFunc ;==>__display Func __Snapwebcam() If BitAND(GUICtrlRead($Checkbox1), 1) Then $i += 1 $Sav = $Dirsv & "\Snap_" & $i & "_.jpg" Else $Sav = "" EndIf ;__SenToFile($startwebcam, $Dirsv & "\Snap.bmp") ;__SaveImage($Dirsv & "\Snap.bmp", 455, 304, GUICtrlRead($Inputtext) & @CRLF & _Date(), 0, 0, 20, $Sav, $Form1) ;FileDelete($Dirsv & "\Snap.bmp") __SenTobmpclip($startwebcam) __SaveImage("", 455, 304, GUICtrlRead($Inputtext), 0, 0, 20, $Sav, $Form2) EndFunc ;==>__Snapwebcam Func _Date() Return " [" & @MDAY & "\" & @MON & "\" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "] " EndFunc ;==>_Date Func __Start() If $Startcap Then __Stopwebcam($startwebcam) $Startcap = 0 GUICtrlSetData($Button1, "Start") Else Local $Getport = _Cheklist(GUICtrlRead($Combo1)) If @error Then Return If $startwebcam <> "" And $Getport = $lastGetport Then __Starttwebcam($startwebcam) Else $startwebcam = __startwebcam($Getport) If @error Then $startwebcam = "" MsgBox(16, "Error", "Failed to connect to device!", 0, $Form1) Return EndIf $lastGetport = $Getport EndIf $Startcap = 1 GUICtrlSetData($Button1, "Stop") EndIf EndFunc ;==>__Start Func _Cheklist($op = "") For $i = 1 To $listeDrivercapt[0] If $op = "" Then GUICtrlSetData($Combo1, $listeDrivercapt[$i], $listeDrivercapt[1]) Else If $op = $listeDrivercapt[$i] Then Return $i - 1 EndIf EndIf Next Return SetError(2) EndFunc ;==>_Cheklist Func _EXIT() Exit EndFunc ;==>_EXIT Func _EXITLib() If $Startcap Then __Stopwebcam($startwebcam) __Disconwebcam($startwebcam) __Dllclose() _GDIPlus_Shutdown() EndFunc ;==>_EXITLib Func __startwebcam($Port = 0) Local Const $WS_CHILD = 0x40000000 Local Const $WM_CAP_DRIVER_CONNECT = 1024 + 10 Local $cap = DllCall($avi, "int", "capCreateCaptureWindow", "str", "cap", "int", $WS_CHILD, "int", 0, _ "int", 0, "int", 0, "int", 0, "hwnd", GUICreate("", 0, 0), "int", 1) $cap = $cap[0] Local $wb_connect $wb_connect = DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_DRIVER_CONNECT, "int", $Port, "int", 0) ;;Here If $wb_connect[0] = 0 Then For $p = 1 To 20 $wb_connect = DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_DRIVER_CONNECT, "int", $Port, "int", 0) If $wb_connect[0] = 1 Then ExitLoop If $p = 20 Then WinKill(HWnd($cap)) ; Error connecting to device close window Return SetError(1) EndIf Next EndIf GUISetState(@SW_DISABLE) Return $cap EndFunc ;==>__startwebcam Func __SenTobmpclip($cap) Local Const $WM_CAP_GRAB_FRAME_NOSTOP = 1024 + 61 Local Const $WM_CAP_EDIT_COPY = 1024 + 30 DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_EDIT_COPY, "int", 0, "int", 0) EndFunc ;==>__SenTobmpclip Func __SenToFile($cap, $savto) Local Const $WM_CAP_GRAB_FRAME_NOSTOP = 1024 + 61 Local Const $WM_CAP_FILE_SAVEDIBA = 1024 + 25 DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", $savto) EndFunc ;==>__SenToFile Func __Starttwebcam($cap) Local Const $WM_CAP_STArt = 1024 DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_STArt, "int", 0, "int", 0) EndFunc ;==>__Starttwebcam Func __Stopwebcam($cap) Local Const $WM_CAP_STOP = 1024 + 181 DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_STOP, "int", 0, "int", 0) EndFunc ;==>__Stopwebcam Func __Disconwebcam($cap) Local Const $WM_CAP_DRIVER_DISCONNECT = 1024 + 11 DllCall($user, "int", "SendMessage", "hWnd", $cap, "int", $WM_CAP_DRIVER_DISCONNECT, "int", 0, "int", 0) WinKill(HWnd($cap)) EndFunc ;==>__Disconwebcam Func __Webcamini() $avi = DllOpen("avicap32.dll") $user = DllOpen("user32.dll") EndFunc ;==>__Webcamini Func __Dllclose() DllClose($user) DllClose($avi) EndFunc ;==>__Dllclose Func __GetlisteDrivercapt() Local $StructName = DllStructCreate("char[1024]") Local $aRslt, $Arrymdriv[1] For $i = 0 To 99 $aRslt = DllCall($avi, "bool", "capGetDriverDescriptionA", "dword", $i, "ptr", DllStructGetPtr($StructName), "dword", DllStructGetSize($StructName), "int", 0, "int", 0) If @error Then Return SetError(1) If $aRslt[0] Then ReDim $Arrymdriv[$i + 2] $Arrymdriv[0] = $i + 1 $Arrymdriv[$i + 1] = DllStructGetData($StructName, 1) Else ExitLoop EndIf Next $StructName = 0 Return $Arrymdriv EndFunc ;==>__GetlisteDrivercapt Func __SaveImage($sFilePath, $width, $height, $stext, $_X, $_Y, $_Z, $sFile, $hGUI) Local $Result, $ret, $sCLSID, $hImage, $hBitmap = 0 If $sFilePath = "" Then _ClipBoard_Open(0) $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP) _ClipBoard_Close() If Not $hBitmap Then Return 0 EndIf $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap) _WinAPI_DeleteObject($hBitmap) Else $hImage = _GDIPlus_ImageLoadFromFile($sFilePath) EndIf $hImage = _GDIPlus_ScaleImage($hImage, $width, $height) If $stext <> "" Then Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) Local $hFamily = _GDIPlus_FontFamilyCreate("Arial") Local $hFont = _GDIPlus_FontCreate($hFamily, $_Z, 1) Local $hFormat = _GDIPlus_StringFormatCreate(0x4000) Local $hBrush2 = _GDIPlus_BrushCreateSolid(0xffffffff) Local $hPen = _GDIPlus_PenCreate(0xC4000000, 1) Local $tLayout = _GDIPlus_RectFCreate($_X, $_Y, $width, $height) Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $stext, $hFont, $tLayout, $hFormat) _GDIPlus_GraphicsDrawStringEx($hGraphic, $stext, $hFont, $aInfo[0], $hFormat, $hBrush2) _GDIPlus_PenDispose($hPen) _GDIPlus_BrushDispose($hBrush2) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_GraphicsDispose($hGraphic) EndIf If $hGUI <> "" Then $hGraphicGui = _GDIPlus_GraphicsCreateFromHWND($hGUI) _GDIPlus_GraphicsDrawImage($hGraphicGui, $hImage, 0, 0) _GDIPlus_GraphicsDispose($hGraphicGui) EndIf If $sFile <> "" Then $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") $Result = _GDIPlus_ImageSaveToFileEx($hImage, $sFile, $sCLSID, 0) EndIf _GDIPlus_ImageDispose($hImage) ClipPut('') Return $Result EndFunc ;==>__SaveImage Func _GDIPlus_ScaleImage($hImage, $iW, $iH) ;coded by UEZ 2012 Local $hBitmap = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0) $hBitmap = $hBitmap[6] Local $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsDrawImageRect($hBmpCtxt, $hImage, 0, 0, $iW, $iH) _GDIPlus_ImageDispose($hImage) _GDIPlus_GraphicsDispose($hBmpCtxt) Return $hBitmap EndFunc ;==>_GDIPlus_ScaleImage Func start_chrono() $chrono = 10 EndFunc ;==>start_chrono