Bilder erkennen und vergleichen

  • VB.NET

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von Telcrome.

    Bilder erkennen und vergleichen

    Guten Morgen

    Bei meinem neuen Projekt um das geht, fehlt mir irgendwie die richtige ansatzweiße. Also mein Progamm soll in einem Spiel Icons erkennen, und mir sagen welches Icon gerade zu sehen ist. Diese icons kommen immer an der gleichen Stelle im Spiel. Es handelt sich hierbei um 5 verschiedene Richtungspfeile und es soll mir sagen welche richtung verlangt wird. Mein Grundgedanke ist das es einen Screennshot der jeweilgen Position macht, und dann das entstandene Bild mit meinen vorhandnen Vergleichsbildern vergleicht. und mir sagt das ist jetz Bild A, B, C, D, oder E oder es ist einfach nix an dieser Stelle. Meine erste überlegung war die Bilder Pixel für Pixel zu vergleichen aber, ich bin mir nicht sicher ob das nicht zu viel Leistung fressen würde, da es doch auch recht schnell gehen sollte, und das Spiel selber so manchen Rechner schon an seine Grenzen bringt. ;) Was die ganze Sache erschwert ist das diese Icons einen transparenten Hintergrund haben und somit zwar die Pfeile wie immer aussehen aber der hintergrund immer etwas anders, was bei einem vergleich Pixel für Pixel warscheinlich auch immer für ein anderes Ergebniss sorgen würde.

    Hat Jemand vieleicht eine Gute Idee mit welcher Metode ich Diese Icons vergleichen könnte, ich muss zugeben das ich mit dem vergleichen von Bilder auch noch nicht so oft befasst habe, und nicht weiß welche möglichkeiten es alles gibt.

    Gruß Wild-Life78
    Wenn die Pfeile immer gleich aussehen und an gleicher Stelle sind, dann müsstest du nur doch nur bestimmte Pixels des Pfeils prüfen ob sie der gleichen Farbe entsprechen.
    Ich habe mal ein Beispiel angehängt. Dabei muss eben nur sicher gestellt sein, dass der Screenshot vom Pfeil wirklich immer von der selben Stelle gemacht wird, wenn nur ein Pixel verschoben klappt das mit fix angaben nicht mehr und du müsstest erstmal mit einer Funktion die Position des Pfeils rausfinden um danach die Eckpunkte zu prüfen.
    Bilder
    • Unbenannt.PNG

      1,65 kB, 226×165, 1.130 mal angesehen
    mhh ohne mich jetzt festnagegeln zu lassen, sag ich mal die position ist immer gleich, mhh??? doch denke schon alles andere würde kein Sinn machen. Also wenn ich Dich jetzt richrige verstehe, müsste ich für jedes Icon die Eckpositionen herausfinden, diese sozusagen Screenshotten, und dann die Farbe vergleichen, haben alle Eckpunkte die Gleiche Farbe müsste es sich um das gesuchte Bild handeln. Irgendiewie ist Die idee genial. Und da ich ja dann nur bestimmte Pixel vergleiche dürfte der Rechenaufwand doch recht gering ausfallen. Ok Du, die Idee ist richtig gut. Muss mich jetzt nur etwas neu einlesen, da ich mit Bildern noch nicht viel gemacht habe.

    Fehlt mir nur eine Grundlage, wie vergleiche ich die Farbe eine Pixels, hat Jemand guten Lesestoff? oder eine Kurze anleitung?

    Naja zut Not gibts ja die Suchfunktion

    Aber Deine Idee gefällt mir, auch wenns wohl doch etwas aufwendiger wird, wie ich dachte.

    Danke Dir
    Da es nur ein paar Pixels sind, kannst du die GetPixel()-Methode eines Image oder Graphics nutzen, weiß gerade nicht wodrin diese Methoden enthalten sind, aber wenn danach googlest mit dem Zusatz Keyword "MSDN" wirst du das richtige finden mit kleiner Beispielerklärung zur Anwendung.

    Das erste mal, die Pixel rausfinden würde ich ein kleines extra Programm schreiben, wo dann den Screenshot von der selben Position machst, ihn in eine PictrueBox lädst und dann z.B. mit den Maustaste die Pfeilecken anklickst um die X-Y Position heraus zu bekommen. Diese musst du danach nur noch prüfen und ich denke damit sollte das ziemlich einfach funktionieren. Sollte der Pixel nicht an der angegebenen Stelle gefunen werden, könnte man ja noch eine kleine Erweiterungsmethode zu GetPixel() schreiben, wo du eben eine X-Y Koordinate angibst und eine Farbe und es wird dann um den angegebnen Pixel noch +- 3 Pixel drum herum nach der Farbe gesucht. Selbst das sollte mit GetPixel() funktionieren. Ansonsten is halt diese Methode für die Analyse eines ganzen Bildes zu langsam und man verwendet lieber LockBits, aber das auch etwas komplizierter. Somit würde ich an deiner stelle erstmal mit GetPixel() anzufangen.
    Ja ich bin schon am lesen, finde es gerade sehr interessant da es mal was komplett neues ist, zumindest für mich, es erscheint mir, gerade etwas schwirig im Spiel die position der Eckpunkte herauszufinden, deswegen werde ich wohl in der ersten funktion ein Screenshott vom Icon machen desen Position ich ja schon habe, die große beträgt 64x64 Pixel. Dieses werde ich in eine Picturebox laden und dort mit weiteren Funtionen die eckpunkte abfragen, wenn ich Diese denn mal irgenwann habe :D
    Wer malt denn die Bilder hin, die Du auswerten willst?
    Wenn das Du selbst bist, kannst Du Dir doch in einer einfachen Variable merken, was da für ein Bild angezeigt wird (bei 5 Bildern 0 bis 5 - 0- keins, ansonsten Bild 1 bis 5).
    Ansonsten nicht einzelne Punkte testen, sondern kurze Linien, innerhalb derer ein Übergang vorhanden sein muss (Bild von @Dodo:, berarbeitet):
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Weiß nicht ob Dich jetzt Richtig verstehe. " Wer malt denn das Bild hin...." Die Bilder gibt mir das Game vor und erwartet dann von mir eine Reaktion bzw im besten Fall die richtige Reaktion :D das heist also, ich weiß nicht was für ein Bild kommt, und genau das soll dieses Programm für mich übernehmen. An welchen Punkten ich das letztendlich mache, ist "so denke ich zumindest" egal, ob Eckpunkte oder Linie, wichtig ist das sie für das Programm einen eindeutigen Wiedererkennungswert haben, und eine verwechslung ausgeschlossen ist. Mir scheint das mit den Eckpunkten vollkommen ausreichend zu sein und es sollte auch mit einem Pixel, pro Eckpunkt ganz gut zu funktionieren. ich bin gestern leider nicht all zu weit gekommen da mir das Arbeitsleben immer wieder dazwischen funkt... sollte das echt aufgeben :S Bin gerade dabei Die Punkte und Positionen zu bestimmen.

    Was ich mir dann lernen muss bzw aus dem Stegreif nicht weiß, ist, wie ich in Vb die Farbe abfrage? Das werde ich mit dann aber noch rausuchen, es sei denn Jemand mag mir das veraten. Das würde mir etwas Zeit sparen.

    Gruß Wild-life78

    Wild-Life78 schrieb:

    Die Bilder gibt mir das Game vor
    Also Du hast 5 verschiedene Bilder, die Du unterscheiden willst, und diese Bilder kannst Du reproduzierbar in Position und Größe wie auch immer einlesen.
    Dann musst Du lediglich diese 5 Bilder voneinander unterscheiden, und dazu sollten ganz wenige Punkte genügen.
    Wo also ist das Problem?
    Kannst Du diese Bilder mal posten (png, nicht jpg)?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja Die Bilder Kann ich Dir zeigen, bin leider nicht so schnell im Programmieren wie hier die Vorschläge kommen. Was ja nicht unbedingt negativ ist, freue mich über Jeden Tip, weil manchmal sieht man die Dinge zu Engstirnig. " wcf_src="http://www.vb-paradise.de/" alt="a>" title="a>" />

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Wild-Life78“ ()

    Du musst in jedem Bild Punkte finden, die in anderen nicht vorhanden sind.
    z.B.
    Ein senkrechter Strich kommt nur in Bildern mit hoch / runter-Pfeil vor.
    Ein waagerechter Strich kommt nur in Bildern mit links / rechts-Pfeil vor.
    usw.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei derartigen Bildern ist es vielleicht sinnvoll, dass Du Dir aus jedem Bild dieselbe Zeile als Color-Array abspeicherst und dann anhand der Übereinstimmung mit dieser Zeile das Bild identifizierst.
    Also bei jedem Bild die 32. Zeile auslesen, überprüfen, ob sie überall unterschiedlich ist (wenn nicht - neue Zeile oder 2 Zeilen) und in Deinem Code abspeichern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe gerade eine Lib für sowas geschrieben habe heute aber keine Zeit. Wenn du mich morgen dran erinnerst, poste ich die sourcecodes

    Sind zwar noch nicht perfekt aber deine Zwecke dürften damit voll kommen gedeckt sein

    Ich hab auch eine Funktion drin, mit der man eine kleine gespeicherte Bitmap in einem bestimmten Bereich eines Screenshots suchen kann

    Sind async Funktionen die mit await aufgerufen werden können
    Ob das jetzt Cheaten ist oder nicht, ist eine Ansichtsache, da ich nicht großartig spiele sondern das nur auf bitten einiger Leute aus diesem Spielforum mache ist mir das eigentlich Egal, unter Cheaten würde ich eher verstehen wenn ich agresiv in das Spielgeschehen eingreifen würde, das was ich hier Programmiere oder zumindest versuche liese sich auch bit jeder heutigen Gamingtastatur oder Maus via Makro machen, von daher sei es legitim. Alles was einem in einen solchen Onlinespiel einen vorteil bringen würde ist eh aus gutem Grund Serverseitig gespeichert, und daran zu gehen, wäre schon mehr "Hacken" wovon ich aber großem Abstand nehme. Ich würde es Mehr als eine erleichtrung sehen. Der Reiz für mich liegt mehr am basteln einer Lösung für diesen Prozess. Ja Klar ich bitte hier um Hilfe, aber ob mir Jemand hilft oder nicht muss Jeder für sich selbst entscheiden, ich zwinge niemanden Dazu, sondern habe von Anfang an geschrieben was ich vorhabe und machen möchte.

    Mfg Wild-Life78
    Definition Wiki:
    Als Cheat (englisch für Betrug, Schwindel) wird die Möglichkeit bezeichnet, in einem Computerspiel selbst oder durch externe Programme das Spiel in einer nicht dem gewöhnlichen Spielverlauf entsprechenden Weise zu beeinflussen.
    Aber ist wie inne Gesellschaft insgesamt: FairPlay ist heutzutage ja keine Tugend, sondern eine Art "geistige Behinderung".
    Also du bist ja der Depp, wennde FairPlay versuchst.
    Also du bist ja der Depp, wennde FairPlay versuchst

    ich weiß zwar nicht was an meinen vorherigen Beitrag, so schwer zu verstehen ist, was dieses Programm macht ist nix weiter als den Jenigen die gleichen Chancen zu geben die keine Supertolle Makrotastatur haben. Wenn Du mit deine Meinung/ Ansicht auch nur Minimal Recht haben würdest. Dann wäre Wohl zb, Logitech, Razer, Cyborg usw usw, die wohl größten hersteller Profesioneller Cheats und absolute verfechter des "NotFairPlay" wenn dies nicht Legetim wäre warum tun Sogar die hersteller mancher Spiele, wie zb für dieses auch, sogar Emphelungen für gewisse Makroeinstellungen geben.

    Aber wie gesagt, ich habe Spass und einen gewissen Reiz darin ein Programm zu schreiben das diese Funktionen übernimmt.

    und da Du mich als Depp bezeichnest, aber selber nichtmal in der Lage bist zu erkennen um was es hier wirklich geht, versuche ich garnicht zu erklären wer hier wohl wirklich der Depp ist, was mir eigentlich auch mein angestrebter, stehts freundlicher Umgang in Foren verbietet.

    Gruß Wild-life78
    Bin mir nicht Sicher wie er es meint, ganz Ehrlich ich spiele hier von Anfang an mit offenen Karten und habe um ein Paar Ratschläge gebeten, letztenlich ist es auch ein Forum in dem es ums Programmieren geht, und genau das tue ich gerade, es liegt mir fern hier mich mit Jemanden streiten zu wollen. Auch habe ich ein Alter und eine Reife erreicht wo ich mich durchaus in der Lage sehe die Meinung anderer zu akzeptieren, im gleichen Zug erwarte ich aber auch das die Menschen mit denen ich umgehe, mir gleiches zugestehen. Wenn er es nicht so meint, ( was ich immer noch nicht weiß) und ich es falsch aufgefasst habe, möge man mir verzeiehen.

    Auch bin ich der Meinung das diese Diskusion zu rein garnix führt. Fände es wirklich gut wenn wir uns mit dem eigentlichen Thema befassen wobei ich der Lösung doch schon Recht nahe bin. Ich mir lediglich gerne andere Vorschläge anhöre, weil Programmieren ist eine tolle Sache und wenn man sich verschiedene Lösungsansetze von verschiedenen Leuten anschaut, kann man maximal noch was dazulernen, was ja nicht unbedingt schlimm ist.

    Allerdings fände ich es gut wenn nur die Leute darauf antworten, die sich auch damit idenifizieren können, und dann keine schlaflosen Nächte haben, weil sie mir geholfen haben. ;)
    @Wild-Life78: Kannst Du Dich nun bitte mal wieder dem Problem zuwenden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!