Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bild im Internet Explorer finden? (https://www.delphipraxis.net/174955-bild-im-internet-explorer-finden.html)

gee21 21. Mai 2013 15:04

Bild im Internet Explorer finden?
 
Hallo, habe mal wieder eine Frage.

Ich habe im Internet Explorer eine Homepage geöffnet. Auf dieser Homepage laufen die ganze Zeit viele kleine Männchen herum die alle etwas anders aussehen.
Jetzt würde ich gerne ein Programm schreiben in dem ein gewünschtes Männchen gesucht wird und dann der Mauszeiger darauf geschoben wird.

Ich dachte mir man könnte es ja evt so machen:

1. ich würde einfach alle 500ms (oder so) einen Screenshot des ganzes Monitors machen (Internet Explorer Fenster)
2. Ich scanne den gemachten Screenshot komplett durch und wenn es das gewünschte Menschlein findet, gibt es einfach die Pixel / Cursor Position an.
3. Masuzeiger wird an die Position versetzt

Screenshot kriege ich sicher hin. Das mit dem Maus Cursor setzen auch. Aber wie finde ich ein Bildchen im Bild?

Grüsse aus der Schweiz
www.geesoft.ch der Second Hand GameShop für PS3 XBOX 360, XBOX 720 und Wii

Der schöne Günther 21. Mai 2013 15:12

AW: Bild im Internet Explorer finden?
 
Automatisierte Bildverarbeitung ist jetzt nichts triviales was man sich an einem langen Nachmittag aneignet, nur als Hinweis vorab ;-)

Daher wohl nicht der optimale Ansatz - Das geht bestimmt besser. Nicht dass ich wüsste wie. Man kann doch von außen sicher den irgendwie den Dokument-Baum des IE auslesen und mehr oder weniger ausrechnen, wo das Bild (relativ zur linken oberen Rahmenecke) stehen müsste?

Luckie 21. Mai 2013 15:16

AW: Bild im Internet Explorer finden?
 
Formuliere dein Frage anders, dann wird es dir selber klarer, was du tun musst. Wenn du einen Screenshot gemacht hast, dann hast du ja nur noch ein Bild bestehen aus Pixeln. Die Bilder von den Männchen sind ja jetzt auch nur noch ein Pixelmuster in dem Screenshot. Du musst also nicht nach einem Bild im Bild suchen (Das gibt es ja gar nicht mehr.), sondern nach einem Pixelmuster, welches dem ursprünglichen Bild des Männchens entspricht. Deine Frage lautet also: Wie finde ich ein bestimmtes Pixelmuster in einer Grafik/Bild?

gee21 21. Mai 2013 15:18

AW: Bild im Internet Explorer finden?
 
Hi Luckie

Du hast absolut Recht! So meinte ich das eigentlich auch.

Wie finde ich ein bestimmtes Pixelmuster in einer Grafik/Bild?

Wie sucht man den nach einem Pixelmuster?

Luckie 21. Mai 2013 15:32

AW: Bild im Internet Explorer finden?
 
Im Prinzip ganz einfach: Man geht das Bild Pixel für Pixel durch und guckt, ob die Pixelfarbe der gesuchten Pixelfarbe entspricht. Wenn man so ein Pixel gefunden hat, betrachtet man die Pixel drum herum und guckt, ob auch sie einer gewünschten Pixelfarbe entsprechen. Das Problem ist, dass die die gesuchte Pixelfarbe natürlich seltenst der Vorlage entspricht. Man muss also eine gewisse "Unschärfe" einbauen. Hinzukommt, dass auch das Muster nicht unbedingt immer genau die gesuchte Form hat. Strichwort wäre hier auch Schrifterkennungssoftware.

Caps 21. Mai 2013 15:35

AW: Bild im Internet Explorer finden?
 
Ein (relativ) einfacher Ansatz (wenn auch nicht sehr performant) wäre die Hough-Transformation.
Das funktioniert vor allem dann, wenn das Männchen ein starres Bild (Sprite), d.h. wenn es nicht z.B. animiert ist.

Ein etwas anderer Ansatz ist eine zweidimensionale, diskrete Kreuzkorrelation, d.h. das Produkt des isolierten Männchens mit allen Teilflächen an potentiellen Positionen des Männchens auf dem Screenshot. Da wo das Produkt maximal ist, ist die Chance am größten, dass sich das Männchen befindet.

Bei beiden Ansätzen müssen die Farbkanäle einzeln verarbeitet werden, da die Algorithmen einen eindimensionalen Funktionswert erwarten.

lg Caps

ps. Eine gewisse Art, Toleranz ("Unschärfe") beim Suchen anzuwenden, stellt in den beiden Verfahren der Funktionswert der Transformierten bzw. der Korrelationsfunktion dar - je höher desto besser ist der Treffer. Wenn mal ein Pixelchen fehlt, klappt die Erkennung meist trotzdem.

Edit:
Für die Hough-Transformation sollte das Männchen parameterisiert sein (Vektorgrafik), sonst geht's nicht, sorry.

gee21 21. Mai 2013 15:45

AW: Bild im Internet Explorer finden?
 
Huui :-D

Danke euch für eure schnellen Antworten. Bin immer wieder positiv überrascht was ihr alles wisst :)

Also das gesuchte Männlein (oder das gesuchte Symbol) ist nur 1 Bild (nicht animiert).
So könnte ich vermutlich die Hough-Transformation benutzen.

Also die Theorie habe ich nun verstanden :-). Hat vielleicht jemand ein Beispiel oder Tutorial dazu? :-D

gee21 21. Mai 2013 15:50

AW: Bild im Internet Explorer finden?
 
Zitat:

Edit:
Für die Hough-Transformation sollte das Männchen parameterisiert sein (Vektorgrafik), sonst geht's nicht, sorry.
Oh gar nicht gesehen. Ich denke ich kann keinen Screenshot als Vektorgrafik erstellen. Oder doch?

Ich denke es gibt ein normales Bmp oder Jpg wenn ich einen "normalen" Screenshot mache.

Caps 21. Mai 2013 15:51

AW: Bild im Internet Explorer finden?
 
Das Problem bei der Hough-Transformation ist, dass Du das Männchen in Parametern beschreiben müsstest, so wie eine Vektorgrafik. Es gibt die generalisierte Hough-Transformation, die funktioniert mit jeder Art Muster.

Ich denke die Kreuzkorrelation würde besser funktionieren bzw. leichter umzusetzen sein. Es handelt sich ja eigentlich nur um zwei verschachtelte for-Schleifen mit etwas Beilage und Dressing.

gee21 21. Mai 2013 16:15

AW: Bild im Internet Explorer finden?
 
Habe gerade mal etwas im Forum rumgeschaut und das einzige was ICH gefunden habe und evt für mich hilfreich SEIN KÖNNTE?
Bin eben noch ziemmlicher Anfänger und daher sind auch einfache Sachen für mich immer noch Schwierig zu realisieren.


Könnte man evt mit diesem Code etwas anfangen? (Ist von diesem Beitrag: http://www.delphipraxis.net/144655-b...tion-zncc.html)

Delphi-Quellcode:
function TForm1.CompareImages(Image1,Image2:TBitmap):Int64;
 var x,y:integer;
    P1,P2:PRGBTripleArray;
    summe1,summe2:integer;
 begin
   result := 0;
   summe1 := 0;
   summe2 := 0;
   for y := 0 to Image1.Height -1 do
    begin
      P1 := Image1.ScanLine[y];
      P2 := Image2.ScanLine[y];
        if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple)) then
          begin
            for x := 0 to Image1.Width-1 do
              begin
                inc(summe1,RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
                inc(summe2,RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
                if summe1 <> summe2 then
                  begin
                    summe1 := 0;
                    summe2 := 0;
                    inc(result);
                  end;
              end;
          end;
    end;
   Application.ProcessMessages;
 end;

In diesem Beispiel wird zwar der % Satz der Differenz der Pixel gesucht (Wenn ich es richtig verstanden habe :oops:)
Aber es wäre doch ein ähnliches Prinzip oder so?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz