Laden...

Wie ist es möglich ein (Teil-)Bild in einem Bild zu suchen? (Bildsucher)

Erstellt von Atomroflman vor 16 Jahren Letzter Beitrag vor 16 Jahren 19.692 Views
A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren
Wie ist es möglich ein (Teil-)Bild in einem Bild zu suchen? (Bildsucher)

Ist es irgendwie möglich ein Bild im Bild zu suchen?

Ich habe zum Beispiel den markierten Smiley vorgegeben und will nun eine Koordinate von einem Eckpunkt des Bildes haben... Geht das ?(

Suchhilfe: Teilbild

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

das geht schon. Der naive Ansatz wäre einfach zu gucken, ob man die Farbe des linken oberen Pixel des zu suchenden Bildes irgendwo im "großen" Bild findet und wenn ja, ob die Pixel, die sich jeweils rechts daneben befinden, ebenfalls die gleiche Farbe haben und das solange, bis man eine Stelle im "großen" Bild gefunden hat, an der alle Pixel des kleinen Bildes vorkommen.

Siehe Bitmap.GetPixel.

Wenn du das so weit implementiert hast, kann man an die Verbesserungen gehen, die das ganze aber verkomplizieren. Daher ist es vermutlich am besten, du versuchst dich erstmal an dieser nativen Lösung.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

aber jedes einzelne Pixel auf dem Monitor zu untersuchen ob die Farbe stimmt dauert doch sicher ziemlich lange... bei 1280 x 1024 ?

aber egal ich versuch das denn erstmal 😁

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

klar dauert das lange, vor allem da GetPixel ziemlich langsam ist. Aber trotzdem solltest du es wie gesagt erstmal so machen und Verbesserungen in einem zweiten Schritt angehen.

herbivore

738 Beiträge seit 2007
vor 16 Jahren
5.742 Beiträge seit 2007
vor 16 Jahren

Hallo Atomroflman,

wenn du Objekte auf Bildern erkennen willst, findest du einige Treffer zu Objekterkennung mit der Forumssuche.
Allerdings ist so ein Vorgang sehr kompliziert. Wozu benötigst du denn diese Koordinaten - vielleicht lässt sich dein Problem einfacher lösen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo winSharp93,

Bilderkennung ist in der Tat sehr schwierig, aber darum geht es ja hier nicht. Atomroflman will ja im Prinzip nichts anderes als die Analogie von String.IndexOf für Bilder. Und das ist nun relativ simpel und geht, wie ich es beschrieben habe.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Ganz genau so ist es...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Wie kann ich nun von meinem Bildschirm ein Screenshot machen der in der BitMap die durchsucht werden soll abgelegt wird ?(

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

5.742 Beiträge seit 2007
vor 16 Jahren

Da hilft dir die Forumssuche weiter (Screenshot, Graphics.DrawImage, Graphics.FromImage)

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

genau Forumssuche. Außerdem passt die Frage nicht in diesen Thread. Deshalb bitte diese Frage hier nicht weiter behandeln.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Kann ich mit GetPixel nur Pixel auf meiner Form untersuchen ?(
Weil wenn ich GetPixel aufrufe bekomm ich folgenden Fehler:

Parameter must be positive and < Height.

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Fehler behoben waren 2 Parameter verdreht... 😁

Allerdings 2 Pixel zu vergleichen scheint nicht zu gehen... denn die Bedingung

 if (ScreenMap.GetPixel(j, i).Equals(CompareMap.GetPixel(0, 0)))

wird nie erfüllt...

d.h. er geht nie in die if Anweisung rein...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Auch den Fehler hab ich gefunden aber ich weiss nicht wie ich ihn beheben soll...
Das ist das vergleichbild (das gesucht wird)...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Und das das bild das duchsucht wird... Beide vergrößert...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

naja, wenn die Bilder nicht gleich, sondern nur ähnlich sind, dann musst du eine Schwelle festlegen, um die die (Summe der) Pixel höchstens voneinander abweichen dürfen.

Oder sind zu findendes Bild und das Vergleichsbild auch noch unterschiedlich groß? Dann geht es wirklich langsam in Richtung Bilderkennung?

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

nein die sind beide gleich groß aber das eine ist halt unscharf und das andere ist scharf... X( mie würde es ja schon reichen wenn das eine unscharfe scharf wäre...

das scharfe habe ich mit Drucken-Taste und paste gemacht und das unscharfe entsteht in meinem programm...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

wie ich schon gesagt habe, musst du dann eine Schwelle verwenden, bei der die Pixel noch als gleich erkannt werden.

Du kannst auch das kleine Bild an jede Stelle des großen Bildes "positionieren" und dort die Summe der (quadratische) Abweichung zwischen den Pixelwerten berechnen und da wo diese minimal wird (und zusätzlich unterhalb einer bestimmten Schwelle liegt) hast du dein Bild gefunden.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Gibt es eine elegante Lösung um ein Image in eine Bitmap umzuwandeln ?(

Bisherige:

            
//Das ist das Image
Shot.Save(Application.StartupPath.ToString() + @"\Bild2.bmp");
// Das soll die Bitmap werden
Bitmap ScreenMap = new Bitmap(Application.StartupPath.ToString() + @"\Bild2.bmp");

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

Bitmap ist eine Unterklasse von Image. Wenn dein Image also in Wirklichkeit sowieso eine Bitmap ist, dann musst du einfach nur casten:


Image img = new Bitmap (...);
Bitmap bmp = (Bitmap)img;

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Ich kann irgendwie keinen Fehler mehr finden...
Entweder bin ich zu blind oder zu blöd... X(

hier habe ich irgendwie eine Enloschleife eingebaut... nur wo ?(


for (int i = 1; i < ScreenWidth - CompareMap.Width; i++)
            {

                for (int j = 1; j < ScreenHeight - CompareMap.Height; j++)
                {
                    if (ColorChecker.Equals(ScreenMap.GetPixel(i, j),CompareMap.GetPixel(0, 0)))
                    {
                        for (int k = 0; k < CompareMap.Width -1; k++)
                        {
                            for (int l = 0; l < CompareMap.Height -1; l++)
                            {
                                if (ColorChecker.Equals(CompareMap.GetPixel(k, l),ScreenMap.GetPixel(k + i, l + j)))
                                {
                                    found = true;
                                }
                                else
                                {
                                    found = false;
                                    break;
                                }
                            }
                        }
                        
                    }
                    if (found)
                    {
                        MyPoint = new Point(i, j);
                        break;
                    }
                }
                if (found) break;
            }
            
            return MyPoint;

Achso Colorchecker.Eqals() überprüft ob 2 Farben in etwa gleich sind...
i,j,k,l sind einfach nur Zähler...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo Atomroflman,

was funktioniert denn nicht? Exception (wenn ja, wo)?
Es ist normal, dass die Ausführung des Programmes sehr lange dauert.

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

das Problem war wohl das es wirklich ziemlich lange dauert weil ich es gerade im Hintergrund vergessen habe und er dann einen Wert ausgespuckt hat...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

naja, dann können jetzt langsam die zu Anfang angesprochenen Optimierungen beginnen, z.B. GetPixel und SetPixel um Längen geschlagen. 800 mal schneller

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Weiss jemand wie sich "stride" zusammensetzt ?(

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

was heißt zusammengesetzt? Stride ist ein int Wert. Was er angibt, steht in der Doku:

Ein Schritt ist die Breite einer einzelnen Zeile von Pixeln (einer Scanzeile), aufgerundet auf eine 4-Byte-Begrenzung. Ein Schritt ist immer größer oder gleich der tatsächlichen Breite in Pixel. Wenn der Schritt postitiv ist, verläuft die Bitmap von oben nach unten. Wenn der Schritt negativ ist, verläuft die Bitmap von unten nach oben.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Wie kann ich den verlauf von einer Bitmap verändern?(
Ich bekomme einen negativen stride brauche aber einen positiven, was bedeutet dass ich den Verlauf der Bitmap ändern müsste, oder?(

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

ich denke nicht, dass du den Verlauf ändern musst. Du musst es nur beim Zugriff berücksichtigen. Der Absolutwert des Strides gibt ja trotzdem die korrekte Bereite einer Zeile an.

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Den absolutwert bekomm ich ja durch:


            if (Orginalwert < 0)
            {
                Absolutwert = -1 * Orginalwert;
            }
            else
            {
                Absolutwert = Orginalwert;
            }

Oder ?(

Absolutwert ist ja nichts anderes als der Betrag einer Zahl, oder wie meinst du das ?(

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Atomroflman,

Absolutwert ist ja nichts anderes als der Betrag einer Zahl

richtig

Den absolutwert bekomm ich ja durch:

ja, oder durch Math.Abs

herbivore

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Jetzt erhalte ich aber im gleichen Segment eine: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." Exeption...

Ich weiss aber nicht wie ich das beheben kann... Kann es daran liegen das die RoBitmap-Klasse in einer eigenen Class-Libary liegt?(
Also würde es reichen meine Funktion in die Class-Libary zu verschieben?( Oder Gibt es die möglichkeit der Klasse den Zugriff zu erlauben?(
Über einen "unsafe"-Block habe ich es schon versucht... bekomme ich den gleichen Fehler...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

Hat sich erübrigt... 😁 👍

Der Sucher läuft... mit einer Zeit von ca 300ms / Search...
ist denke ich akzeptabel... Danke an herbivore, der mir am meisten geholfen hat... 👍

Edit: und Robertico für seine RoBitmap Class 😁 👍 wunderbares Ding!!!

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

L
770 Beiträge seit 2006
vor 16 Jahren

als dank könntest du das ja anderen usern zur verfügung stellen 🙂
ich denke ein "bild sucher" wird doch hier und da mal gebraucht 🙂

lg

lg Lion

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

werde ich die Tage mal machen... ich denk mal heute abend... 🙂

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 16 Jahren

So da ist er nun... Was lange währt wir bekannterweise gut...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...