![]() |
Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Gesture (Pre-Alpha Version)
So, nachdem durch einen Systemabsturtz ne Menge Daten verloren gingen, habe ich mich hingesetzt und Gesture noch einmal geschrieben. Und nun ist es wieder auf dem Entwicklungsstand wie das alte. Was ist Gesture? Gesture ist ein lernfähiges Mausgesten-Erkennungssystem, was nichts anderes heißt, als dass man dem Programm Gesten beibringen kann, die mit der Maus einfach auf den Bildschirm gezeichnet werden. Wie benutze ich Gesture? Wenn das Programm gestartet wird, nistet es sich im SysTray ein. Nun kann mit gedrückter rechter Maustaste irgendwo auf dem Bildschirm eine Geste gemalt werden. Nach loslassen der Taste verschwindet die Geste sofort wieder. Im Kontextmenü des TrayIcons lässt sich mit "Geste speichern" die aktuell gezeichnete Geste speichern. Von nun an sollte Gesture, wenn diese Geste nocheinmal gezeichnet werden, diese auch erkennen (In diesem Falle erscheint die Meldung: "Gesture Found: {Gesten-Index}". Kann keine Geste erkannt, werden erscheint die Meldung: "No Gesture Found." (das ist auch der Fall, wenn noch keine Geste gespeichert wurde). Was ich mit Gesture noch vorhabe: Durch die Mausgesten sollen Aktionen ausgeführt werden (wie z.B: öffne Mail-Client etc.). Dabei können Gesten global gelten oder nur auf bestimmte Anwendungen beschränkt werden. Die mögliche Auswahl der Aktion soll durch ein Plugin-System erweiterbar sein. Die Aktionszuweisung soll über ein seperates Programm erfolgen, was ich wahrscheinlich mit Hilfe der VCL schreiben werde. Auch gefallen würde mir die Aktionen über eine Scriptsprache zu realisieren, allerdings wüsste ich noch nicht, welche dafür in Frage käme... . Ich habe versucht in den Kommentare so viel zu erklären, wie möglich. Wenn etwas nicht nachvollziehbar ist, einfach nachfragen. Also, wer Lust hat, kann sich in den Code einarbeiten (wobei ich natürlich helfe, so gut ich kann) und mitprogrammieren, ist ja schließlich OpenSource :). Wenn das Programm ersteinmal soweit ist, dass es auch benutzbar ist, werde ich es unter Sourceforge veröffentlichen ( ![]() aktuelle Version: Gesture 0.0.2 (Pre-Alpha-Version) Änderungen: Nur Bugfixes Kompilat: ![]() Source: ![]() [Edit: 15. Mai 2005] Hinweis: Ich wurde vor Kurzem gebeten, eine neue Version von Gesture hier vorzustellen. Da allerdings aus Zeitmangel die Entwicklung nur in periodischen Intervalen vorangeht, wird es wohl noch eine Weile dauern, bis ich die nächste Pre-Alpha veröffentliche. Bis dahin kann der Interessierte den Fortschritt im CVS Repository verfolgen: ![]() |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Zitat:
Zitat:
Zitat:
Zitat:
Habe XP, SP1, IE6 (mit Crazy Browser) |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Ein Papagei :drunken:
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Aber ein beserer. Ich habe zu mindest das OS, SP und IE Version angegeben. ;)
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Er findet die mousehook.dll nicht (nur so als kleiner tipp :zwinker: )
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
wie hast du das rausgefunden?
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Steht im Quellcode :stupid:
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
ganz vergessen dass es den auch noch gibt :oops:
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Hüstel :oops: Man ist das peinlich ;). Habs am ersten Beitrag verändert.
Achso, natürlich danke für das Feedback :mrgreen: |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Gleicher Fehler kommt
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Dito.
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
So, jetzt aber. Tut mir schrecklich leid :oops:.
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
wie funktioniert das jetzt?
achso... hab die falsche zip gestartet... sorry... |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
So, tut mir schrecklich Leid für dich! :cry:
Code:
Nach dem Loslassen der Maustaste!
---------------------------
Gesture: Gesture.exe - Fehler in Anwendung --------------------------- Die Ausnahme "unknown software exception" (0xc000008e) ist in der Anwendung an der Stelle 0x004098eb aufgetreten. Klicken Sie auf "OK", um das Programm zu beenden. Klicken Sie auf "Abbrechen", um das Programm zu debuggen. --------------------------- OK Abbrechen --------------------------- System: WinXP mit SP1 |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
bei mir funktioniert es?! ich hab auch XP+SP1
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Ok, eine kurze Erläuterung der Funktionsweise:
Wenn eine Geste auf den Bildschirm gezeichnet wird, werden erstmal die ganzen Koordinaten gespeichert. Da diese Punkte unregelmäßige Abstände zueinander haben, werden die Abstände ersteinmal mit InterpolateMouseway vereinheitlicht. Das bedeutet Punkte die zu dicht zusammenliegen werden aufgelockert und bei zu hohem Abstand neue hinzuberechnet. So, jetzt ist ersteinmal die Grundlage geschaffen. Jetzt geht es weiter, indem die Geste auf Richtungswechsel überprüft wird (das geschieht mit GetImportantPoints). Der Punkt, wo der Richtungswechsel auftritt wird gespeichert. Sind alle Richtungswechsel erfasst werden der Geste mit FillGesture noch weitere Punkte hinzugefügt. Die Geste wird also auf auf die in GESTUREIPC angegebene Anzahl reduziert. Wenn nun zwei Gesten miteinander verglichen werden, geschieht das in zwei verschiedenen Verfahren(CompareGestures: Verfahren 1
Code:
Hier wird die Abweichung festgestellt, die Strecke P2-P3 von P1-P2 macht. Je nachdem in welche Richtung die Abweichung geschieht ist die Gradzahl negativ oder positiv.
P = Punkt (ImportantPoint)
o P3 / / . ------------- dieser Winkel P1 o----------o- - - - - # P2 Verfahren 2
Code:
Hier wird der Winkel zu einer gedachten Linie, die paralell zur Y-Achse verläuft ermittelt.
#
| |--- gedachte Linie . | dieser Winkel ---: o P1 ./ / / P2 o Der Algorithmus geht Punkt für Punkt beide Gesten durch und vergleicht sie miteinander. Sind am Schluss nur wenig Abweichungen zwischen den Gesten ermittelt worden, gilt die Geste als erkannt. Sind es zuviele, dann nicht. Ist das verständlich? Ich habe zur Entwicklung ein Programm geschrieben, dass das ganze ein wenig grafisch aufbereitet (nicht zu viel erwarten: ![]() |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Zitat:
Wenn nein, dann ist das ein Bug, denn ich noch lösen muss. Anscheindend wird irgendwo im Code eine fehlerhafte Berrechnung durchgeführt. |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
so ein programm hab ich schonmal gehabt, nur das es nur 2 Z-Formen erkennen konnte welche entweder alle fenster minimiert oder maximiert hat
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Wie funktioniert bei euch die Gestenerkennung?
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Zitat:
WinXP Sp2 (Pre) zu Früh gefreut, hatte gerade nen üblen ![]() hab einfach die rechte Maustaste mal nicht losgelassen und eine RIESIGE Geste gezeichnet. (kam nur einmal, sonst bricht er bei zu langen Gesten ohne Fehler ab) |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Zitat:
Danach kamen immer nur so Fehler wie "Keine Geste vorhanden" oder so! :gruebel: |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Wenn man jedesmal eine Geste solange zeichnet bis das Programm nicht mehr mitzeichnet, bleibt das Programm nach dem 3ten Mal (also bei der 4. grossen Geste) hängen.
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Hab bissl rumprobiert und dann hats auch mal geklappt. Was ich nicht weiß: Muss ich erst auf "Geste speichern" klicken und dann die Geste zeichnen oder umgekehrt? Hab einfach die gehste vor und nach einem klick auf "Geste speichern" gemalt so das es irgendwie klappt. Dann fände ich eine übersicht nicht schlecht wo man die ganzen gehsten sieht mit dem raum der darum liegt. wenn ich also zum beispiel ein "Z" male wöllte ich ein Fett gezeichnettes "Z" sehen damit ich weiß wie genau ich die figur nachzeichnen muss. Und dann fänd ichs noch supi wenn man die genauigkeit einstellen könnte. Also das beim erneuten zeichnen die pixel pro Punkt maximal 20 Pixel von denen der ursprünglichen Zeichnung abweichen dürfen wobei die 20 einstellbar sein soll... Wenn man das ganze noch mit funktionen dann hinterlegen lassen kann würde ich das prog auf jeden fall täglich nutzen.
Achja, noch paar dinge die ich mir wünschen würde: Es wäre nicht schlecht wenn man einstellen könnte ob der Linie auf den Desktop gezeichnet wird oder nicht. Dann wenn man noch die Tastenkombination einstellen könnte. Also das ich zum Beispiel Strg + Linke Maustaste zum erstellen einer neuen Funktion drücken muss und zum abrufen das ganze auch optional. Eventuell sogar so das man einstellen kann das die maustaste gar nicht dazu gedrückt werden muss. Also das die maus einfach nur bewegt werden muss wobei da die problematik ist herauszufinden wann meine zeichnung anfängt, aber das ist ja dann das Problem des Programmierers :wink: Hab grad gemerkt dasses programm nen neuen ordner anlegt zur speicherung oder so, wäre ni schlecht wenn man den ort selbst bestimmen könnte. |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Das Programm ist einfach genial!
Ich würd es schon benutzen, wenn ich damit einfach nur Programme ausführen könnte. Die gespeicherten Gesten würde ich auch gerne sehen können (und eventuell sogar bearbeiten?) und Hotkeys und maximale Abweichung bei der Gestenerkennung einstellen können. [edit] bei mir kam einmal "ZeroDivide" (Hab Win2k) als ich einen einfachen senkrechten Strich nach unten gezeichnet habe. Gruß, Christoph |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
So, ersteinmal danke für das viele Feedback. :thuimb:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ich versuch das mal zu beantworten, auch wenn ich damit vielleicht in keiner Weise dein Anliegen beantorte, ich versuchs einfach mal: Es gibt keinerlei Vorgaben, welche Gesten du zeichnen kannst. Du kannst dir irgendetwas ausdenken. Eine Dreieck, ein zur einer Seite geöffnetes Viereck, ... was du willst. Nur musst du dir die Geste eben merken und wiederholen können. Ich weiß nicht, was du mit den 20 Pixeln Abweichung meinst :? Zitat:
Wie schon oben geschrieben, werde ich ein komfortables Verwaltungsprogramm schreiben, wo alle gespeicherten Gesten angeguckt werden, Gesten Aktionen zugewiesen werden und Einstellungen vorgenommen werden können (z.B. die Tastenkombination). Um das Drücken einer Taste, wenn du eine Geste zeichnest wirst du nicht drumrum kommen. Wie du sagst, anders habe ich keine Möglichkeit festzustellen, wann eine Geste begonnen wird. Außerdem könnte es dann mal leicht passieren, dass man aus Versehen eine Geste zeichnet und z.B. plötzlich das aktuelle Programm geschlossen wird. Zitat:
Zitat:
Der ZeroDivide-Fehler sowie der Fehler, der manchmal nach der Gestenzeichung auftritt, sind Probleme die mir zwar bekannt sind, aber deren Lösung ich noch nicht ersonnen habe. Die kritische Stelle ist in der GestureRec2.pas in Zeile 564 und Zeile 573 zu finden. Die Bedienung wird auf jedenfall noch um einiges komfortabler! Doch braucht es noch einige Zei, bis Gesture so weit ist. Bis dahin zum Testen: Wie benutzt ich Gesture (die aktuelle Pre-Alpha-Version): Mit gedrückter rechter Maustaste eine Geste auf den Bildschirm malen. Gefällt euch die Geste und ihr wollt, dass Gesture sie "lernt" dann geht ihr (ohne eine neue Geste zu zeichnen!) auf "Geste speichern" im Kontextmenü des TrayIcons. Von nun an sollte Gesture die Geste wieder erkennen, wenn sie irgendwann wieder auf den Bildschirm gezeichnet wird. Sollte dies der Fall sein, erscheint die Meldung "Gesture found: [Gesten-Index]". Der Index beginnt bei 0, das heißt, die erste gespeicherte Geste erhält den Index 0, die zweite 1, usw. |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Noch ein Hinweis, wie man am besten Gesten zeichnet, damit sie auch erkannt werden:
So eine Gestenerkennungsroutine ist immer ein Spagat zwischen genügend Toleranz um kleinere Zeichenfehler zu ignorieren und als solche zu erkennen und nicht zuviel Toleranz, so dass plötzlich ein M für ein N gehalten wird. "I do my very best, Mrs. Sophie." Wiedereinmal wird deutlich, wie schwer für einen Computer etwas sein kann, wozu ein Säugling schon in der Lage wäre (und wie schwer es für den Programmierer ist, es dem Computer trotzdem beizubringen :wink:). |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
So, ich habe die Erkennung ein wenig Toleranter gemacht. Die Erkennung sollte nun besser funktionieren.
Kompilat: ![]() Sauce: ![]() |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Ja ja .. nich schlecht .. sehr gut sogar
Das mit der Erkennung klappt jo schon sehr gut ! Nur, nach 5 - 6 versuche .. total crach ... Windows Shell ganz verstümelt ... oO .. Versuchts nochmal ... und mache nen screen wenns geht! [EDIT] Nope, <Print Screen> will nicht .. :? .. ABER .. es kommt immer beim 10. Versuch! |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Ich glaub da stimmt irgendwas mim Speichermanagment nicht. Wenn man mal die Speicherauslastung im Taskmanager anschaut, während man Gesten zeichnet. Es kommt nur ständig was dazu ohne, dass wieder was freigegeben wird.
Ich benutze ja schon einen statischen Array mit einer Länge von 2000. Wie kann ich den Speicher wieder freigeben, der benutzt wird? |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
benutze doch einfach eine Liste (zum Beispiel TList) dann bist du nicht auf 2000 Einträge beschränkt und mitm aufräumen ist eigentlich auch kein Problem
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Die Idee ist gar nicht so schlecht! Ich denke ich werd mir mal selbst was zusammenhacken. Thx.
|
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Ich habe ein paar kleine Veränderungen an Gesture vorgenommen. Das wichtigste ist die Einführung einer verketteten Liste, um den Mausweg zu speichern.
Allerings besteht das Problem, dass der Speicher nach dem Zeichnen einer Geste nicht wieder freigegeben wird. Ich weiß nicht, woran das liegt: Auszug aus GestureList.pas:
Delphi-Quellcode:
{...}
PItem = ^TItem; TItem = packed record Data: TFloatingPoint; Next: PItem; end; procedure TGestureList.Add(APoint: TFloatingPoint; pos: integer = -1); var cur_item, new_item: PItem; begin GetMem(new_item, SizeOf(TItem)); new_item^.Data := APoint; if pos = -1 then pos := ItemCount; if pos = 0 then begin cur_item := StartItem; new_item^.next := cur_item; StartItem := new_item; Inc(ItemCount); end else if pos <= ItemCount then begin cur_item := GetItem(pos-1); new_item^.next := cur_item^.next; cur_item^.next := new_item; Inc(ItemCount); end else Dispose(new_item); end; procedure TGestureList.Delete(Pos: integer); var del_item, cur_item: PItem; begin if StartItem <> nil then if pos = 0 then begin del_item := StartItem; StartItem := StartItem^.Next; Dispose(del_item); Dec(ItemCount); end else if pos < ItemCount then begin cur_item := GetItem(pos-1); del_item := cur_item^.Next; cur_item^.Next := del_item^.Next; Dispose(del_item); Dec(ItemCount); end; end; procedure TGestureList.DelAllFromItem(var Item: PItem); begin if Item <> nil then begin if Item^.Next <> nil then DelAllFromItem(Item^.Next); //Rekursion! FreeMem(Item, SizeOf(TItem)); Item := nil; end; end; {...} |
Re: Gesture - ein lernfähiges Mausgesten-Erkennungssystem
Der Speicherbug ist getilgt. Es lag nicht an der genannten Unit sondern an einem vergessenen ReleaseDC in der DesktopDraw.pas. Thx to Memproof und Keldorn@delphi-forum
Gesture 0.0.2 (Pre-Alpha-Version) Änderungen: Nur Bugfixes Kompilat: ![]() Source: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz