Maus mit Webcam steuern

  • Hi liebe Leute,

    zuerst:
    Meine Webcam macht wenig FPS, deswegen gibt es kaum andere Möglichkeiten als den Mauszeiger zu Bewegen.
    Außerdem konnte ich auch nur für meine Webcam testen.
    Ich hätte gerne Visual C++ benutzt um ASm einzubauen, da hab ich aber nicht geschafft das Projekt richtig zu konfigurieren, deswegen nun wieder GNU GCC für C++ mit Coed::Blocks ohne ASM.
    Dazu kommt, wenn ich selber compilen wollt, braucht ihr eine richtige Code::Blockseinstellung und überhaupt erstmal die OpenCV-Lib


    so nun zum Wichtigen:
    Ich freu mich euch die Webcamsteuerung 2.0 vorzustellen. Früher gab es mit VFW von campweb gepostet die 9-Kästchen Version, bei der ein roter Punkt im Bild gesucht wurde. Dann wurde einfach der Punkt zu einem der 9 Kästchen zugeteilt und das wars. Die Nachteile sind klar: der Hintergrund darf kein rot haben, aber man muss einen roten Gegenstand in der Hand halten. Das ist aber jetzt Schnee von gestern.

    Mit meiner Steuerung gibt es weder Kästchen noch einzigartigfarbige Gegenstände ;)
    Ich hab mein Programm so programmiert, dass man gemütlich mit der Hand oder sonstigem die Maus steuern kann. Dafür wird zu Anfang festgestellt ob die Hand von links oder rechts kommt, also ob die Webcam rehts oder links neben euch steht. Dann werden alle geänderten Pixel "detektiert" und der am weitesten von euch entfernte Punkt gilt als Position. Um derbildrauschenden Webcam meinerseits vorzubeugen kam der liebe Gauß ins Spiel. Wenn ihr eine noch schlimmere Webcam habt als Ich und das Programm spinnt, sagts mir, vielleicht kann ich noch etwas ändern. Außerdem nicht gut für das Programm ist, wenn sich die Webcam bewegt und das ganze Bild geändert wird, allerdings, sobald sich das Bild wieder beruhigt funktioniert das Programm auch wieder wunderbar.

    Wenn ihr mal meine Testansicht sehen wollt, probiert im Sourcecode mit ausgeklammertem "#define FINAL" oder einfach die "Webcam_dev.exe".
    Ansonsten die normale Ansicht mit "Webcam_bewegung.exe". In der normalen Version hängt der grüne Punkt ein Bild hinterher, weil das vorherige mit dem neuen Bild verleiche.
    Sinnvollerweise ist in der Nähe des Bildrandes auch der virtuelle Bildschirmrand (etwas weiter Innen, weil man den grünen Punkt nie nach ganz außen kriegen wird)


    So ich hoffe es ist alles gut erklärt und vollständig. Das Programm soltle wunderbar funktionieren, wie genau man damit steuern kann ist fraglich, aber nach meinen Tests ging es schon relativ gut, mehr ist aus meiner Webcam nicht rauszuholen ^^


    Nun ans Eingemachte:
    Alles was man braucht ist in der zip, ich hoffe ihr mögt es ;)


    mfg


    PS:
    Wenn am Anfang nichts passiert und kein grüner Punkt zu sehen ist, obwohl eure Hand mittem im Bild ist. Dann nehmt die Hand nochmal aus dem Bild und bewegt sie langsam wieder ins Bild, dann sollte der grüne Punkt erscheinen und alles wie in Butter laufen.

    PS 2:
    Dank OpenCV kann man die GUI leider nur schließen, indem man im aktiven Zustand des Fensters ESC drückt

    PS 3:
    Die zip passt nicht in den Anhang, daher hier:
    http://www.solidfiles.com/d/cf776bfbcd/

  • Eine kleine technische Frage...es gibt ja einige Webcams, die den Fokus immer auf den User legen, also seinen Bewegungen durch motörchen folgen. Ich vermute mal damit würde es nicht klappen stimmts? Ich wollte mir nähmlich testweise so eine kaufen (ich probiere gerne solche Sachen aus, der Preis spielt dabei meistens nicht so eine Rolle...ausserdem könnte ich so eine Cam gut für Skype brauchen).

    Bild1: Ich beim debuggen

  • Ich vermute dass du diese Funktion in den Webcameinstellungen ausstellen kannst wenn du willst, aber wenn es an ist, wird es vermutlich nicht funktionieren. Im Bild ist aber nur deine Hand, wer weiß ob die verfolgt wird, kommt drauf an ob die Kamera Bewegung oder Gesicht verfolgt

  • Hi,

    Ich hätte gerne Visual C++ benutzt um ASm einzubauen, da hab ich aber nicht geschafft das Projekt richtig zu konfigurieren, deswegen nun wieder GNU GCC für C++ mit Coed::Blocks ohne ASM.


    Für 32bit:
    Eigentlich musst Du da nichts in der Konfiguration einstellen.
    Inline Assembler

    Für 64bit:
    MASM for x64 (ml64.exe)

    • Projekt -> Buildanpassungen
    • "masm(targets, props)" auswählen

    Soweit ich weiß, wird der Konfigurationsdialog für MASM in den Projektoptionen aber nicht angezeigt (Bug).
    Da der x64-Compiler kein Inline Assembly mehr verarbeitet, musst Du eben den ASM-Code in separate Module packen.
    Hierfür empfehle ich aber eher JWasm, damit ist es wesentlich komfortabler 64bit-Assembler zu schreiben.
    Die erforderlichen Dateien um JWasm mit VC zu nutzen sind dabei (Readme lesen!)


    Gruß
    Greenhorn

    ps, im Anhang ein VC Projekt, bei dem der Konfigurationsdialog für den Assembler in den Projektoptionen angezeigt wird (64bit mit WinInc ).

  • Hey,

    Das ganze hätte man deutlich schöner Programmieren können. Variablen hast du mal mit deutschen und mal mit englischen Wörtern bezeichnet. Programmiert wird in Englisch, auf jeden fall hab ich es so gelernt. Auch CamelCase sollte jedem Programmierer bekannt sein.
    Die Funktionalität kann ich leider nicht beuhrteilen, da sich meine intigrierte Webcam erst bei Start deiner Application einschaltet und somit jede menge veränderungen verstgestellt werden, jedoch nie meine Hand :)

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Greenhorn, ich meinte, dass ich OpenCV nicht so einfach für alle Projekte einbinden konnte, inline ASM braucht nichtmal ein include o.ä.

    Darter, du könntest den Lappi neben dich stellen und schräg draufgucken zum Test ^^

    Was meinen Programmierstil angeht hast du recht, ich war zu faul die Variablen umzubennen nach dem Testen und der reinen Bewegungserkennungaus Autoit