![]() |
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 |
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? |
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?
|
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? |
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.
|
AW: Bild im Internet Explorer finden?
Ein (relativ) einfacher Ansatz (wenn auch nicht sehr performant) wäre die
![]() 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 ![]() 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. |
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 |
AW: Bild im Internet Explorer finden?
Zitat:
Ich denke es gibt ein normales Bmp oder Jpg wenn ich einen "normalen" Screenshot mache. |
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. |
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: ![]()
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? |
AW: Bild im Internet Explorer finden?
Zitat:
Es ist nicht empfehlenswert, als Anfänger gleich derart schwierige Unterfangen zu starten. Wenn du die oben beschriebene Aufgabe lösen möchtest, mußt du auch verstehen, wie der Code, den du dazu einzusetzen gedenkst, funktioniert. Daher stellt kopierter Kode, den du offensichtlich nicht verstehst, keine brauchbare Vorgehensweise dar. Auch bei Komponenten, die ja oft massenweise Code enthalten, der nicht immer auf Anhieb zu verstehen ist, mußt du zumindest wissen, wie die Komponente arbeitet, um sie sinnvoll einsetzen zu können. Einfach mal was kopieren und dann im Forum fragen, ob man das mit diesem Code machen könnte, stößt bei den meisten fortgeschrittenen Programmierern auf impulsive Ablehnung, weil du nämlich den Eindruck erweckst, du seist nur an einer Irgendwie-Lösung des Problems interessiert und nicht, wie man diese Lösung selbst entwickelt. Die Hinweise mit dem Pixelmuster müßten eigentlich genügen, um diese Aufgabe lösen zu können. Weitere Hinweise wären ScanLine und die Überlegung, daß mit der jeweiligen Position des Männleins im IE ja vielleicht auch ein anderer Hintergrund-Ausschnitt verbunden ist. Ergo müßtest du den Hintergrund des Männleins erst einmal korrekt entfernen und dann im Bild danach suchen, wo sich das Männlein-Muster befinden könnte. Du mußt dazu einfach via Scanline die einzelnen Zeilen auf die Männlein-Farben testen. Findest du die erste Farbe sagen wir mal von der linken oberen Ecke des Männleins, dann prüfst du, ob die nächste Farbe mit dem zweiten Pixel des Männleins übereinstimmt usw. Studieren der Hilfe zu Scanline wird dich sicher weiterbringen, wenn du das möchtest. Eine schnelle Erledigung der Aufgabe wirst du als "ziemlicher Anfänger" wohl nicht auf die Reihe bekommen, daher sind Geduld und Ausdauer angesagt. Das Resultat nennt man Fortschritt. |
AW: Bild im Internet Explorer finden?
OK, Danke für deine Info. Finde ich gut was du geschrieben hast. Da es auch ein ziemlich unwichtiges / FUN Projekt ist, wollte ich auch nur eine Irgendwie/schnelle/einfache Lösung. (Beim Mändlein ist übrigens immer der gleiche Hintergrund).
Wenn ich sehe wie einfach es ist, zwei "Gleich grosse" Bilder zu vergleichen kann es ja nicht so schwer sein ein Pixel Bereich in einem gesammten Bild zu finden. Scanline habe ich mittlerweile auch entdeckt. Wie du aber richtig schreibst, verstehe ich es nicht. (Oder noch nicht) werde mich mal schlau machen, üben und testen. Danke |
AW: Bild im Internet Explorer finden?
So also. Habe mal etwas versucht. Leider klappt es absolut noch nicht richtig... (Aber immerhin schon ein wenig :-D)
1. Wenn ich den folgenden Code so ausführe, listet er mir zwar die Farbe der Pixel aus der 1. Zeile auf. Aber leider krieg ich am Schluss eine Fehlermeldung: Zugriffsverletzung Ntdll.dll. Weitere Fehlermeldungen erhalte ich merkwürdigerweise wenn ich die Projekt.exe dann schliesse. Weiss jemand was ich falsch mache? 2. im Memo werden zuerst alle Farben so aufgeführt: $00F7F7F7 ein paar werden aber plötzlich so aufgeführt: clWhite Warum denn das? 3. Hier habe ich nun zum testen nur mit der 1. Zeile gearbeitet. trotzdem geht es relativ lange...(2-3 Sekunden) Ich vermute mal dass es bei einem Bild von 1680x1050 viel zu lange dauern würde alles SO auszulesen und dann noch nach einem gewissen Bereich zu suchen. Was kann man da machen?
Delphi-Quellcode:
var
Bild: TBitmap; p: PBytearray; zeile, spalte: integer; r, g, b: byte; begin Bild:=form1.Image1.Picture.Bitmap; //pf32 oder 24? Bild.pixelformat := pf32Bit; // Nur die erste Zeile auslesen (Als Test) zeile:= 0; // Später dann Alle Zeilen so auslesen? : for zeile := 0 to Bild.height do //Alle Spalten / Pixel einer Zeile auslesen for spalte := 0 to Bild.Width do begin; //Zeiger auf Zeile setzen p := Bild.scanline[zeile]; //Hier die 3 Farbwerte pro Pixel auslesen (Diesen Teil hab ich im Netz gefunden) b := p[spalte * 4]; g := p[spalte * 4 + 1]; r := p[spalte * 4 + 2]; // Ab ins Memo als test und um später das gesuchte Teilbild per String zu suchen. memo1.Lines.Add(ColorToString(rgb(r, g, b))); end; bild.free; end; |
AW: Bild im Internet Explorer finden?
Hallo,
Zitat:
Zitat:
Zitat:
Zitat:
Gruß |
AW: Bild im Internet Explorer finden?
Neben den Punkten die Volker bereits aufgeführt hat greifst Du mit
Zitat:
Statt des ByteArray kannst Du eine Array of TRGBQuad verwenden
Delphi-Quellcode:
Der Umweg über String und ein Memo im besonderen werden das ganze extrem ausbremsen.
uses exgdi,exgdipapi,exgdipobj;
{$R *.dfm} type pRGBQuadArray = ^TRGBQuadArray; TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad; .... var pscanLine32 : pRGBQuadArray; i,j:Integer; begin Bmp.PixelFormat := pf32Bit; for i := 0 to bmp.Height -1 do begin pscanLine32 := bmp.Scanline[i]; for j := 0 to bmp.Width -1 do begin ... pscanLine32[j].rgbReserved ... ... pscanLine32[j].rgbBlue ... ... pscanLine32[j].rgbRed ... ... pscanLine32[j].rgbGreen ... end; end; end; Ich würde den Vergleich direkt über die Scanlines machen Pseudocodefetzen
Delphi-Quellcode:
...
Pixelidentisch := true; //Loop über i/j Bild1 x/y Bild2 mit Abbruch wenn nicht Pixelidentisch //wenn x und y die Breite und Höhe erreicht haben und Pixelidentisch dann gefunden //das ganze dann jeweils mit erhöhten i und j Werten bis Pixelidentisch oder alles durchsucht Pixelidentisch := Pixelidentisch AND (Integer(pscanLineBitmap1[j]) = Integer(pscanLineBitmap2[x])); ... |
AW: Bild im Internet Explorer finden?
Hallo,
Zitat:
Gruß |
AW: Bild im Internet Explorer finden?
Ich möchte mal einwerfen: mit
![]() |
AW: Bild im Internet Explorer finden?
Top. Danke euch allen für die guten Infos.
Werde mal die nächsten paar Tage wieder weiter machen und eure Tipps ausprobieren. Mal schauen was sich so tut. :-D |
AW: Bild im Internet Explorer finden?
Zitat:
Hallo Bummi versuche gerade deine Vorschäge umzusetzen. Aber es hapert noch etwas. - Wie rufe ich den hier die zusammengefasste Farbe ab und für was benutzt man die rgbReserved? Zitat:
- So möchte ich die beiden Pixel des gesamten 1. Bildes mit dem Ausschnitt des 2. Bildes vergleichen. if pscanLineBILD[j] = pscanLineGesuchtesBILD[j] then ..... So geht's nicht. Ich vermute mal das ich eben zuerst die 3 RGB Farben zusammenfassen muss und dann diese vergleichen muss, oder? habe es noch mit: RGB(r,g,b) versucht aber irgendwie geht das nicht So siehts bei mir mom. aus:
Delphi-Quellcode:
var
Bild: TBitmap; GesuchtesBild: TBitmap; p: PBytearray; zeile, spalte: integer; r, g, b: byte; pscanLineBILD : pRGBQuadArray; pscanLineGesuchtesBILD : pRGBQuadArray; i,i2,j,j2:Integer; begin Bild:=form1.Image1.Picture.Bitmap; gesuchtesBild:=form1.Image2.Picture.Bitmap; for i := 0 to Bild.Height -1 do begin pscanLineBILD := Bild.Scanline[i]; for j := 0 to bild.Width -1 do begin b:= pscanLineBILD[j].rgbBlue; r:= pscanLineBILD[j].rgbRed; g:= pscanLineBILD[j].rgbGreen; end; //Abfrage ob 1. Pixel des gesuchten Bildes übereinstimmt if pscanLineBILD[j] = pscanLineGesuchtesBILD[0] then begin //1. Pixel stimmt, also rest vergeleichen for i := i to Bild.Height -1 do begin pscanLineBILD := Bild.Scanline[i]; for j := j to bild.Width -1 do begin b:= pscanLineBILD[j].rgbBlue; r:= pscanLineBILD[j].rgbRed; g:= pscanLineBILD[j].rgbGreen; for i2 := 0 to gesuchtesBild.Height -1 do begin gesuchtesBild := gesuchtesBild.Scanline[i]; for j2 := 0 to gesuchtesBild.Width -1 do begin b:= pscanLinegesuchtesBild[j].rgbBlue; r:= pscanLinegesuchtesBild[j].rgbRed; g:= pscanLinegesuchtesBild[j].rgbGreen; if pscanLineBILD[j] = pscanLineGesuchtesBILD[j] then abort; // Stimmt nicht mehr überein.... Daher Abbruch if pscanLineGesuchtesBILD[j] = gesuchtesbild.width then showmessage('1. Zeile stimmt überein'); end; end; end; end; end; end; end; end; |
AW: Bild im Internet Explorer finden?
Ich hatte mir das so vorgestellt ....
Delphi-Quellcode:
type
pRGBQuadArray = ^TRGBQuadArray; TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad; Function FindBitmap(Container,Find:TBitmap):TPoint; var SclS,SclF:pRGBQuadArray; xc,yc:Integer; x,y:Integer; Found:Boolean; begin Container.PixelFormat := pf32Bit; Find.PixelFormat := pf32Bit; Result.X := -1; Result.Y := -1; yc:=0; while (yc < (Container.Height-Find.Height - 1)) and (Result.X=-1) do begin xc:= 0; while (xc < (Container.Width-Find.Width - 1)) and (Result.X=-1) do begin y := 0; Found := true; while (y<Find.Height-1) and Found do begin x := 0; SclF := Find.ScanLine[y]; SclS:= Container.ScanLine[yc+y]; while (x < Find.Width -1) and Found do begin Found := Integer(SclS[xc+x])=Integer(SclF[x]); inc(x); end; inc(y); end; if Found then begin Result.X := xc; Result.Y := yc; end; inc(xc); end; inc(yc); end; end; procedure TForm2.Button1Click(Sender: TObject); var p:TPoint; begin Image1.Canvas.Draw(140,140,image2.Picture.Bitmap); //Test bmp2 auf bmp malen um es finden zu können p := FindBitmap(Image1.Picture.Bitmap,Image2.Picture.Bitmap); Caption := Format('X: %d - Y: %d',[P.X,P.Y]) end; |
AW: Bild im Internet Explorer finden?
---
|
AW: Bild im Internet Explorer finden?
Lass es mal bei
Delphi-Quellcode:
Container.PixelFormat := pf32Bit;
Find.PixelFormat := pf32Bit; |
AW: Bild im Internet Explorer finden?
:-) Habs gerade auch kappiert. Sorry du warst schon zu schnell.
und Vielen Dank für deine Hilfe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 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