Today I made a very simple face recognizer.
It measures distance between:
- 1: Eyes and lips
- 2: Hair and eyes
After that it uses this data to create a 'FaceID'.
This ID is used to recognize you.
It has a nice little setup at first run, should be pretty easy.
So here's the code:
#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.6.1 Author: Ludocus Script Function: Face recognition by webcam. #ce ---------------------------------------------------------------------------- ; Script Start - Add your code below here #include <Webcam.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> $xColorFile = @AppDataDir&'\Face Recognition CFile.txt' $Form = GUICreate('Face Regognizer', 320, 240, 0, 0) GUICtrlCreateLabel('test', 10, 10, 50, 50) GUICtrlSetBkColor(-1, 0xFFFFFF) WinSetOnTop($Form, '', 1) $open = _WebcamOpen($Form, 0, 0, 320, 240) global $lips[100000] global $eyes[100000] global $hair[100000] global $ID[10000] $GetFaceID = False $xSpread = 10 ; ---> Reduce this number if program recognizes everyone for you. (Increase if opposite happens.) $t = 0 $p = 0 $s = 0 $z = 0 GUISetState() sleep(500) $color = PixelGetColor(179, 161) _GUICreateBox(99,201,245,255) ; ---> First box: Is for the lips _GUICreateBox(86,132,243,188) ; ---> Second box: Is for the eyes _GUICreateBox(66,52,245,104) ; ---> Third box: Is for the hair $color1 = '' $color2 = '' $color3 = '' $FaceID = '' If not FileExists($xColorFile) Then $ready = False HotKeySet('{SPACE}', '_Space') ToolTip('Hover your mouse over your lips in the bottom box, then click space') Do sleep(100) Until $ready = True ToolTip('Saved colors. Please wait for program to create a face ID') FileWrite($xColorFile, $color1&@CRLF&$color2&@CRLF&$color3) $GetFaceID = True Else $Data = StringSplit(FileRead($xColorFile), @CRLF, 1) If $Data[0] < 4 Then Msgbox(32, 'Oops.', 'Something wrong with the settings file. It is deleted now.') FileDelete($xColorFile) Exit EndIf $color1 = $Data[1] $color2 = $Data[2] $color3 = $Data[3] $FaceID = $Data[4] EndIf While GUIGetMsg() <> $GUI_EVENT_CLOSE $search = PixelSearch(99,201,245,255,$color1,5) If Not @error Then $t += 1 ConsoleWrite("Found lips, X: "&$search[0]&" Y: "&$search[1]&@crlf) $lips[0] = $t $lips[$t] = $search[1] EndIf $search = PixelSearch(86,132,243,188,$color2,5) If Not @error Then ;If $search[1] > 150 and $search[1] < 190 Then $p += 1 ConsoleWrite("Found eyes, X: "&$search[0]&" Y: "&$search[1]&@crlf) $eyes[0] = $p $eyes[$p] = $search[1] ;EndIf EndIf $search = PixelSearch(66,52,245,104,$color3,5) If Not @error Then If $search[1] > 60 and $search[1] < 90 Then $s += 1 ConsoleWrite("Found hair, X: "&$search[0]&" Y: "&$search[1]&@crlf) $hair[0] = $s $hair[$s] = $search[1] EndIf EndIf $lip = _Average($lips) $eye = _Average($eyes) $har = _Average($hair) $dist = ($lip-$eye)+($eye-$har) If $dist > 0 Then If $GetFaceID = True Then $z += 1 $ID[$z] = $dist If $z > 10 Then $ID[0] = $z $FaceID = Round(_Average($ID)) Tooltip('') ConsoleWrite('Saved face ID for recognition: '&$FaceID&@CRLF) FileWrite($xColorFile, @CRLF&$FaceID) $GetFaceID = False EndIf EndIf ConsoleWrite('Face ID: '&$dist&@CRLF) EndIf If $FaceID <> '' Then If $dist > ($FaceID-$xSpread) and $dist < ($FaceID+$xSpread) Then ConsoleWrite("-----------> Person is recognized <-----------"&@CRLF) EndIf If $t > 50 or $p > 50 or $s > 50 Then $t = 0 $p = 0 $s = 0 EndIf ;Sleep(25) WEnd Func _Space() $pos = MouseGetPos() If $color1 = '' Then $color1 = PixelGetColor($pos[0], $pos[1]) ToolTip('Hover your mouse over your iris in the middle box, then click space') ElseIf $color2 = '' Then $color2 = PixelGetColor($pos[0], $pos[1]) ToolTip('Hover your mouse over your a good spot in the third box (hair), then click space') ElseIf $color3 = '' Then $color3 = PixelGetColor($pos[0], $pos[1]) $ready = True ToolTip('') Return EndIf EndFunc Func _Average($var) $ret = '' For $i = 1 to $var[0] $ret += $var[$i] Next Return $ret/$var[0] EndFunc Func _GUICreateBox($x, $y, $right, $bottom) $width = $right-$x $height = $bottom-$y $GUI = GUICreate("", 0, 0, $x, $y, $WS_POPUP) $Top = GUICreate("Top Line", $width, 2, $x, $y, $WS_POPUP, -1, $GUI) GUISetBkColor(0xFF0000) GUISetState() WinSetOnTop($Top, '', 1) $Left = GUICreate("Left Line", 2, $height, $x, $y, $WS_POPUP, -1, $GUI) GUISetBkColor(0xFF0000) GUISetState() WinSetOnTop($Left, '', 1) $Right = GUICreate("Right Line", 2, $height, $x + $width - 2, $y, $WS_POPUP, -1, $GUI) GUISetBkColor(0xFF0000) GUISetState() WinSetOnTop($Right, '', 1) $Bottom = GUICreate("Bottom Line", $width, 2, $x, $y + $height, $WS_POPUP, -1, $GUI) GUISetBkColor(0xFF0000) GUISetState() WinSetOnTop($Bottom, '', 1) Sleep(800) EndFunc ;My Data: ;color1 = 14785985 ;color2 = 3950677 ;color3 = 15268838 ;FaceID = 165
If you find any errors, please comment.
If you like it, please comment.
You'll need the webcam udf (it is in my signature as well).
Or it is here:
#include <WindowsConstants.au3> #include-once $WM_CAP_START = 0x400 $WM_CAP_UNICODE_START = $WM_CAP_START +100 $WM_CAP_PAL_SAVEA = $WM_CAP_START + 81 $WM_CAP_PAL_SAVEW = $WM_CAP_UNICODE_START + 81 $WM_CAP_UNICODE_END = $WM_CAP_PAL_SAVEW $WM_CAP_ABORT = $WM_CAP_START + 69 $WM_CAP_DLG_VIDEOCOMPRESSION = $WM_CAP_START + 46 $WM_CAP_DLG_VIDEODISPLAY = $WM_CAP_START + 43 $WM_CAP_DLG_VIDEOFORMAT = $WM_CAP_START + 41 $WM_CAP_DLG_VIDEOSOURCE = $WM_CAP_START + 42 $WM_CAP_DRIVER_CONNECT = $WM_CAP_START + 10 $WM_CAP_DRIVER_DISCONNECT = $WM_CAP_START + 11 $WM_CAP_DRIVER_GET_CAPS = $WM_CAP_START + 14 $WM_CAP_DRIVER_GET_NAMEA = $WM_CAP_START + 12 $WM_CAP_DRIVER_GET_NAMEW = $WM_CAP_UNICODE_START + 12 $WM_CAP_DRIVER_GET_VERSIONA = $WM_CAP_START + 13 $WM_CAP_DRIVER_GET_VERSIONW = $WM_CAP_UNICODE_START + 13 $WM_CAP_EDIT_COPY = $WM_CAP_START + 30 $WM_CAP_END = $WM_CAP_UNICODE_END $WM_CAP_FILE_ALLOCATE = $WM_CAP_START + 22 $WM_CAP_FILE_GET_CAPTURE_FILEA = $WM_CAP_START + 21 $WM_CAP_FILE_GET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 21 $WM_CAP_FILE_SAVEASA = $WM_CAP_START + 23 $WM_CAP_FILE_SAVEASW = $WM_CAP_UNICODE_START + 23 $WM_CAP_FILE_SAVEDIBA = $WM_CAP_START + 25 $WM_CAP_FILE_SAVEDIBW = $WM_CAP_UNICODE_START + 25 $WM_CAP_FILE_SET_CAPTURE_FILEA = $WM_CAP_START + 20 $WM_CAP_FILE_SET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 20 $WM_CAP_FILE_SET_INFOCHUNK = $WM_CAP_START + 24 $WM_CAP_GET_AUDIOFORMAT = $WM_CAP_START + 36 $WM_CAP_GET_CAPSTREAMPTR = $WM_CAP_START + 1 $WM_CAP_GET_MCI_DEVICEA = $WM_CAP_START + 67 $WM_CAP_GET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 67 $WM_CAP_GET_SEQUENCE_SETUP = $WM_CAP_START + 65 $WM_CAP_GET_STATUS = $WM_CAP_START + 54 $WM_CAP_GET_USER_DATA = $WM_CAP_START + 8 $WM_CAP_GET_VIDEOFORMAT = $WM_CAP_START + 44 $WM_CAP_GRAB_FRAME = $WM_CAP_START + 60 $WM_CAP_GRAB_FRAME_NOSTOP = $WM_CAP_START + 61 $WM_CAP_PAL_AUTOCREATE = $WM_CAP_START + 83 $WM_CAP_PAL_MANUALCREATE = $WM_CAP_START + 84 $WM_CAP_PAL_OPENA = $WM_CAP_START + 80 $WM_CAP_PAL_OPENW = $WM_CAP_UNICODE_START + 80 $WM_CAP_PAL_PASTE = $WM_CAP_START + 82 $WM_CAP_SEQUENCE = $WM_CAP_START + 62 $WM_CAP_SEQUENCE_NOFILE = $WM_CAP_START + 63 $WM_CAP_SET_AUDIOFORMAT = $WM_CAP_START + 35 $WM_CAP_SET_CALLBACK_CAPCONTROL = $WM_CAP_START + 85 $WM_CAP_SET_CALLBACK_ERRORA = $WM_CAP_START + 2 $WM_CAP_SET_CALLBACK_ERRORW = $WM_CAP_UNICODE_START + 2 $WM_CAP_SET_CALLBACK_FRAME = $WM_CAP_START + 5 $WM_CAP_SET_CALLBACK_STATUSA = $WM_CAP_START + 3 $WM_CAP_SET_CALLBACK_STATUSW = $WM_CAP_UNICODE_START + 3 $WM_CAP_SET_CALLBACK_VIDEOSTREAM = $WM_CAP_START + 6 $WM_CAP_SET_CALLBACK_WAVESTREAM = $WM_CAP_START + 7 $WM_CAP_SET_CALLBACK_YIELD = $WM_CAP_START + 4 $WM_CAP_SET_MCI_DEVICEA = $WM_CAP_START + 66 $WM_CAP_SET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 66 $WM_CAP_SET_OVERLAY = $WM_CAP_START + 51 $WM_CAP_SET_PREVIEW = $WM_CAP_START + 50 $WM_CAP_SET_PREVIEWRATE = $WM_CAP_START + 52 $WM_CAP_SET_SCALE = $WM_CAP_START + 53 $WM_CAP_SET_SCROLL = $WM_CAP_START + 55 $WM_CAP_SET_SEQUENCE_SETUP = $WM_CAP_START + 64 $WM_CAP_SET_USER_DATA = $WM_CAP_START + 9 $WM_CAP_SET_VIDEOFORMAT = $WM_CAP_START + 45 $WM_CAP_SINGLE_FRAME = $WM_CAP_START + 72 $WM_CAP_SINGLE_FRAME_CLOSE = $WM_CAP_START + 71 $WM_CAP_SINGLE_FRAME_OPEN = $WM_CAP_START + 70 $WM_CAP_STOP = $WM_CAP_START + 68 #include <GUIConstants.au3> $avi = DllOpen("avicap32.dll") $user = DllOpen("user32.dll") ;=============================================================================== ; ; Description: Open's a webcam preview screen in your gui ; Syntax: _WebcamOpen($sHwnd, $sLeft, $sTop, $sWidth, $sHeight, $sPort=0) ; Parameter(s): $sHwnd - The handle of the gui ; $sLeft - Left coord. of the preview screen ; $sTop - Top coord. of the preview screen ; $sWidth - Width of the preview screen ; $sHeight - Height of the preview screen ; $sPort - Specify wich webcam port you want to use (for multiple webcams) ; Requirement(s): A webcam ; Return Value(s): On Success - Returns id needed for other controls ; On Failure - Returns -1 ; Author(s): Ludocus ; Note(s): If a black/blank screen shows up, try using different $sPort's (0 to 3) ; ;=============================================================================== Func _WebcamOpen($sHwnd, $sLeft, $sTop, $sWidth, $sHeight, $sPort=0) $cap = DllCall($avi, "int", "capCreateCaptureWindow", "str", "cap", "int", BitOR($WS_CHILD,$WS_VISIBLE), "int", $sLeft, "int", $sTop, "int", $sWidth, "int", $sHeight, "hwnd", $sHwnd, "int", 1) DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_DRIVER_CONNECT, "int", $sPort, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_SCALE, "int", 1, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_OVERLAY, "int", 1, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEW, "int", 1, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 0) if @error then return -1 return $cap[0] EndFunc ;=============================================================================== ; ; Description: Creates a Snapshot from a webcam ; Syntax: _WebcamSnap($sId, $sFile) ; Parameter(s): $sId - Id (returned from _WebcamOpen) ; $sFile - File to save the snapshot to (*.bmp) ; Requirement(s): A webcam ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; Author(s): Ludocus ; Note(s): None ; ;=============================================================================== Func _WebcamSnap($sId, $sFile) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_SET_CALLBACK_FRAME, "int", 0, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", $sFile) if @error Then return 0 Else return 1 EndIf EndFunc ;=============================================================================== ; ; Description: Closes the preview screen created with _WebcamOpen ; Syntax: _WebcamClose($sId) ; Parameter(s): $sId - Id (returned from _WebcamOpen) ; Requirement(s): A webcam ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; Author(s): Ludocus ; Note(s): None ; ;=============================================================================== Func _WebcamClose($sId) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_END, "int", 0, "int", 0) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_DRIVER_DISCONNECT, "int", 0, "int", 0) DllClose($user) if @error Then return 0 Else return 1 EndIf EndFunc ;=============================================================================== ; ; Description: Starts recording the webcam to a file ; Syntax: _WebcamRecordStart($sFile, $sId) ; Parameter(s): $sId - Id (returned from _WebcamOpen) ; $sFile - File to save the movie to (*.avi) ; Requirement(s): A webcam ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; Author(s): Ludocus ; Note(s): Stop recording by: _WebcamRecordStop($Id) ; ;=============================================================================== Func _WebcamRecordStart($sFile, $sId) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_FILE_SET_CAPTURE_FILEA, "int", 0, "str", $sFile) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_SEQUENCE, "int", 0, "int", 0) if @error Then return 0 Else return 1 EndIf EndFunc ;=============================================================================== ; ; Description: Stops recording. ; Syntax: _WebcamRecordStop($sId) ; Parameter(s): $sId - Id (returned from _WebcamOpen) ; Requirement(s): A webcam ; Return Value(s): On Success - Returns 1 ; On Failure - Returns 0 ; Author(s): Ludocus ; Note(s): None ; ;=============================================================================== Func _WebcamRecordStop($sId) DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_STOP, "int", 0, "int", 0) if @error Then return 0 Else return 1 EndIf EndFunc
I have changed it a little.
If a blank/black screen shows up: Try changing $sPort in _WebcamOpen (you can use ports from 0 to 3)
Edited by ludocus, 25 February 2011 - 12:15 PM.







