Tach!
Ich hab mal wieder ein Problem, das da wäre:
Ich habe ein Skript geschrieben dass mit Hilfe der fdlib.dll und AutoIt aus einem mit AutoIt getötigten Webcamfoto die Gesichter erkennt und deren Anzahl ausgibt. Das funktioniert soweit mäßig.
Das Problem ist jetzt aber, dass ich laufend die Anzahl der Personen vor der Webcam erhalten möchte. Das geht eber nicht, weil die Webcam erstens eine GUI benötigt und zweitens immer der Webcam-Auswahlbildschirm erscheint. Das macht sich in einer Schleife natürlich nicht so gut.
Das Skript (Funktioniert nciht ohne die Dll, welche es im Anhang samt Source gibt)
Spoiler anzeigen
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <Array.au3>
PR()
[/autoit] [autoit][/autoit] [autoit]Func PR()
#region Constants
$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
$CAM_FILE = "Person.bmp"
$CAM_AVI = DllOpen("avicap32.dll")
$DLL_USER = DllOpen("user32.dll")
$hMain = GUICreate("TLC Person Control", 341, 327, 413, 74)
$CAM_CAPTURE = DllCall($CAM_AVI, "int", "capCreateCaptureWindow", "str", "cap", "int", BitOR($WS_CHILD,$WS_VISIBLE), "int", 10, "int", 20, "int", 320, "int", 240, "hwnd", $hMAIN, "int", 1)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_DRIVER_CONNECT, "int", 0, "int", 0)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_SET_SCALE, "int", 1, "int", 0)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_SET_OVERLAY, "int", 1, "int", 0)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_SET_PREVIEW, "int", 1, "int", 0)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 0)
GUISetState()
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0)
DllCall($DLL_USER, "int", "SendMessage", "hWnd", $CAM_CAPTURE[0], "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", "Person.bmp")
ConsoleWrite(Persons())
GUIDelete()
EndFunc
Func Persons()
;progandy, gtaspider
$hOpen = DllOpen("fdlib.dll")
_GDIPlus_Startup()
$hbBMP = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\Person.bmp")
$iWidth = _GDIPlus_ImageGetWidth($hbBMP)
$iHeight = _GDIPlus_ImageGetHeight($hbBMP)
$hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hbBMP)
$iThreshold = Number(50)
If $iThreshold < 1 Then $iThreshold = 1
$vBMP = _GDIPlus_BitmapToStructByte($hBMP, $iWidth, $iHeight)
DllCall($hOpen, "int:cdecl", "fdlib_detectfaces", "ptr", DllStructGetPtr($vBMP), "int", $iWidth, "int", $iHeight, "int", $iThreshold)
$nFace = DllCall($hOpen, "int:cdecl", "fdlib_getndetections")
If Not @error Then
$Faces = $nFace[0]
Return $Faces
Else
Return 0
SetError(1,1,1)
EndIf
DllClose($hOpen)
EndFunc
Func _GDIPlus_BitmapToStructByte($hBMP, $iW, $iH)
Local $x, $y, $z, $sErrorHandlerString, $hDC, $hDC_tmp, $hBitmap, $vStruct_Byte, $vStruct_BMPInfo
Local $hBitmap = DllCall("User32.dll", "hwnd", "CopyImage", "hwnd", $hBMP, "int", 0, "int", 0, "int", 0, "int", 1);LR_MONOCHROME
If @error Then Return SetError(1, 0, _WinAPI_GetLastErrorMessage())
$hBitmap = $hBitmap[0]
$vStruct_Byte = DllStructCreate("byte graydata[" & $iW * $iH & "]")
[/autoit] [autoit][/autoit] [autoit]Local $vStruct_BMPInfo = DllStructCreate("dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword;dword RGBQuad[256];")
$hDC_tmp = _WinAPI_GetDC(_WinAPI_GetDesktopWindow())
$hDC = _WinAPI_CreateCompatibleDC($hDC_tmp)
_WinAPI_ReleaseDC(0, $hDC_tmp)
Local $hBitmapOld = _WinAPI_SelectObject($hDC, $hBitmap)
DllStructSetData($vStruct_BMPInfo, 1, DllStructGetSize(DllStructCreate("dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword;", 1)))
DllStructSetData($vStruct_BMPInfo, 2, $iW)
DllStructSetData($vStruct_BMPInfo, 3, $iH * - 1)
DllStructSetData($vStruct_BMPInfo, 4, 1)
DllStructSetData($vStruct_BMPInfo, 5, 1)
_WinAPI_GetDIBits($hDC, $hBitmap, 0, $iH, DllStructGetPtr($vStruct_Byte), DllStructGetPtr($vStruct_BMPInfo), 0)
[/autoit] [autoit][/autoit] [autoit]_WinAPI_DeleteObject(_WinAPI_SelectObject($hDC, $hBitmapOld))
_WinAPI_DeleteDC($hDC)
Return $vStruct_Byte
EndFunc ;==>_GDIPlus_BitmapToStructByte
Wer ne Idee hat möge bitte helfen.
MfG, campweb