Hallo liebe AutoitCom,
leider muss ich euch heute schon wieder um Rat fragen.
Vorweg, damit der Thread nicht gesperrt wird: Ich kenne die Forenregeln. Ich möchte keinen Bot oder sonstige illegale Dinge schreiben.
So, nun zum Thema:
Ich mlchte mir auf eine Gui das Bild einer Webcam projezieren lassen (mithilfe der WebCam.au3).
Das klappt auch soweit ganz gut. Nun suche ich dieses Bild nach einem weißen Punkt hab (habe aus Verzweiflung PixelSearch verwendet). Leider ist dieser Befehle verdammt langsam und total von äußeren Einflüssen abhängig.
Deshalb suche ich eine Alternative, um das sich ändernde Bild auf einen weißen Bereich abzutasten.
Ich vermute, dass das Erzeugen eines Snapshots und das Abtasten von diesem durch GDI+ - Funktionen keinerlei Zeitersparnis einbringt.
Mein nächster Gedanke wäre, eine Dll zu schreiben, inder in vielen Threads eine kleinere Menge von Pixeln angetastet werden (z.B: 500 Pixel/Thread). Leider habe ich davon keine Ahnung.
Würde gerne mal wissen, ob ihr mir eine Lösung für dieses Problem vorschlagen könnt.
Viele Grüße, Dank und Entschuldigungen für das erneute Fragen im Vorraus,
stayawayknight
Bisheriges Script:
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Webcam.au3>
;###Intialize Start
Global $sMainTitle = "Test"
Global $iMainLeft = 0
Global $iMainTop = 0
Global $iMainWidth = @DesktopWidth
Global $iMainHeight = @DesktopHeight
Global $iCamLeft = 0
Global $iCamTop = 0
Global $iCamWidth = 640
Global $iCamHeight = 480
Opt("GuiOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]OnAutoItExitRegister("ende")
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}", "ende")
;###Intialize Ende
;###Guis Start
$hMain = GUICreate($sMainTitle, $iMainWidth, $iMainHeight, $iMainLeft, $iMainTop, $WS_POPUP)
GUISetOnEvent($GUI_EVENT_CLOSE, "ende", $hMain)
GUISetBkColor(0xFFFFFF, $hMain)
GUISetState(@SW_SHOW, $hMain)
;----------------------------
$hCam = GUICreate($sMainTitle, $iCamWidth, $iCamHeight, $iCamLeft, $iCamTop, $WS_POPUP, Default, $hMain)
GUISetBkColor(0xFFFFFF, $hCam)
$cCam = _WebcamOpen($hCam, 0, 0, 640, 480)
$cCam = _WebcamOpen($hCam, 0, 0, 640, 480)
GUISetState(@SW_SHOW, $hCam)
;----------------------------
;###Guis Ende
;###GDI+ Start
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hMain)
$hCamGraphics = _GDIPlus_GraphicsCreateFromHWND($hCam)
$cPointerPen = _GDIPlus_PenCreate(0xFFFF0000, 2)
;###GDI+ Ende
While 1
$aPixPos = PixelSearch(5, 5, 640, 480, 0xFFFFFF, 1, 2, $hCam)
If IsArray($aPixPos) Then
_GDIPlus_GraphicsDrawRect($hCamGraphics, $aPixPos[0] - 20, $aPixPos[1] - 20, 40, 40, $cPointerPen)
_CalcToMouse($aPixPos[0], $aPixPos[1])
Else
_GDIPlus_GraphicsDrawStringColor($hCamGraphics, "KEIN POINTER!", 50, $iCamHeight / 2, "Arial", 50, 0xFFFF0000)
EndIf
Sleep(10)
WEnd
Func _CalcToMouse($iX, $iY)
Local $iBetween
$iY = $iY / $iCamWidth
$iY = @DesktopWidth * $iY
$iX = $iX / $iCamWidth
$iX = @DesktopWidth * $iX
If $iX > @DesktopWidth / 2 Then
$iBetween = $iX - (@DesktopWidth / 2)
$iX = (@DesktopWidth / 2) - $iBetween
ElseIf $iX < @DesktopWidth / 2 Then
$iBetween = (@DesktopWidth / 2) - $iX
$iX = (@DesktopWidth / 2) + $iBetween
ElseIf $iX = @DesktopWidth / 2 Then
$iX = @DesktopWidth / 2
EndIf
MouseMove($iX, $iY)
EndFunc ;==>_CalcToMouse
Func _GDIPlus_GraphicsDrawStringColor($hGraphics, $sString, $nX, $nY, $sFont = "Arial", $nSize = 10, $ARGB = 0xFFFFFFFF, $iFormat = 0)
Local $hBrush = _GDIPlus_BrushCreateSolid($ARGB)
Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
Local $iError = @error
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
Return SetError($iError, 0, $aResult)
EndFunc ;==>_GDIPlus_GraphicsDrawStringColor
Func ende()
_GDIPlus_PenDispose($cPointerPen)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_GraphicsDispose($hCamGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>ende
PS: Sorry, dass die Überschrift botverdächtig klingt - mir fällt jedoch keine Aussagekräftigere ein.