Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bilder vergleichen -> optimiertes verfahren gesucht! (https://www.delphipraxis.net/49829-bilder-vergleichen-optimiertes-verfahren-gesucht.html)

Jan 17. Jul 2005 00:12

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Zitat:

Zitat von alleinherrscher
Hi@all!
@Jan: Ich verstehe nicht, warum deine Routine schneller gehen soll...du geht doch per pixels anweisung das ganzen Bild 2 mal durch, dadurch müsste es doch auch im endeffekt doppeltsolange dauern.

Das ist so nicht richtig. das ganze ist aus 2 Gründen theoretisch schneller.
1. Du checkst für JEDEN Pixel im bild ob er kleiner als das bisherige minimum ist und ob er größer ist als das bisherige maximum.
Das ganze habe ich verkürz, indem ich einfach nur den vergleich auf unterschied mache.
undzwar einmal von unten, und den ersten Wert der unterschiedlich ist auf Minimum setze. Danach wird die Schleife abgebrochen. Schlimmstenfalls geht er das ganze Bild durch, aber bestenfalls findet er den Unterschied schon beim ersten Pixel und spart sich jede Menge Laufzeit, außerdem habe ich die ganzen Vergleiche rausgeschmissen weil man die nicht braucht.
Das ganze mache ich dann noch fürs maximum, allerdings dann von oben, weil ich mal denke, dass es wahrscheinlicher ist, dass der Punkt im unteren Bildbereich ist. Somit spart man sich im mittel jede Menge Laufzeit.
Wenn du das ausprobierst kannste ja mal vergleichen.
Gruß
Jan

alleinherrscher 17. Jul 2005 12:37

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
@Jan: Ok, das sehe ich ein. Aber mein Problem ist ja, dass das ganze durch die canvas.pixels[x,y] routine verlangsamt wird, weil die - delphiintern nunmal eine sehr lange zugriffszeit auf das einzelne Pixel hat. Die Pixels[x,y] Funktion ist also der Flaschenhals. Und korrigiere mich, wenn ich falsch liege, du gehst mit der Pixels Funktion ALLE Pixel exakt 2 mal durch, meine Routine aber nur einmal. Sie wird mit sicherheit durch die umständliche if abfrage verlangamt, keine Frage. Aber müsste im Vergleich zu deiner Funktion immernoch schneller sein, weil die nur einmal jedes Pixel abfragt.

@all: Das alle löst leider immernoch nicht mein Problem...Kann es sein, dass die g32 Library da einen Fehler hat? (siehe meine vorherigen Einträge)...ich bekomme exakt das selbe Programm nicht mehr richtig zum laufen, wenn ich canvas.pixels[x,y] durch image32[x,y] ersetzte. Es geht zwar ca. 5 mal schneller, aber arbeit unkorrekt (siehe oben)

Edit: Mir ist gerade aufgefallen, dass es mit g32 "ab und zu" richtig arbeitet. D.h. wenn ich z.B. das erste mal vergleiche, wird das weiße Rechteck richtig erkannt, wenn ich nochmal Klicke, wird zu viel erkannt, wenn ich nochmal klicke wirds wieder richtig erkannt...aber völlig unsystematisch...dh. ich weiß beim nächsten klick nicht, ob es richtig oder falsch erkannt wird....

Hat da jemand einen Rat? Ich bin nämlich ziemlich Ratlos... :wall:

Gruß, Alleinherrscher

alleinherrscher 17. Jul 2005 13:09

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier, hab das Programm mal angehängt. Probiers mal aus. Also wie gesagt, habe bei mir 2 Screenshots mit "PrintScreen"-Taste gemacht, dann in Paint als 24Bit BMP abgespeichert, dann ein weißes Feld gemacht und erneut als anderes 24bit bmp abgespeichert. Manchmal erkennt das Programm das weiße Feld korrekt, manchmal werden aber unterschiede erkannt, obwohl es keine unterschiede gibt...tritt das bei euch auch auf? ruhig 10-20mal testen bitte!

Gruß, Alleinherrscher

Ultimator 17. Jul 2005 13:18

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Zitat:

Zitat von alleinherrscher
Kann es sein, dass die g32 Library da einen Fehler hat? (siehe meine vorherigen Einträge)...ich bekomme exakt das selbe Programm nicht mehr richtig zum laufen, wenn ich canvas.pixels[x,y] durch image32[x,y] ersetzte. Es geht zwar ca. 5 mal schneller, aber arbeit unkorrekt (siehe oben)

Und wenn du
Delphi-Quellcode:
image321.Bitmap.PixelS[x,y]
versuchst?

scp 17. Jul 2005 13:19

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Zitat:

Zitat von alleinherrscher
@Jan: Ok, das sehe ich ein. Aber mein Problem ist ja, dass das ganze durch die canvas.pixels[x,y] routine verlangsamt wird, weil die - delphiintern nunmal eine sehr lange zugriffszeit auf das einzelne Pixel hat. Die Pixels[x,y] Funktion ist also der Flaschenhals. Und korrigiere mich, wenn ich falsch liege, du gehst mit der Pixels Funktion ALLE Pixel exakt 2 mal durch, meine Routine aber nur einmal. Sie wird mit sicherheit durch die umständliche if abfrage verlangamt, keine Frage. Aber müsste im Vergleich zu deiner Funktion immernoch schneller sein, weil die nur einmal jedes Pixel abfragt.

Nein, er geht das ganze Bild nicht zweimal durch, es wird ja direkt unterbrochen, sobald das erste unterschiedliche Pixel gefunden ist. Probiers doch einfach aus.
Du kannst das ganze von Jan auch auf g32 übertragen, dann ist es min. 3-4x so schnell.

Khabarakh 17. Jul 2005 13:34

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Zitat:

Zitat von Ultimator
Zitat:

Zitat von alleinherrscher
Kann es sein, dass die g32 Library da einen Fehler hat? (siehe meine vorherigen Einträge)...ich bekomme exakt das selbe Programm nicht mehr richtig zum laufen, wenn ich canvas.pixels[x,y] durch image32[x,y] ersetzte. Es geht zwar ca. 5 mal schneller, aber arbeit unkorrekt (siehe oben)

Und wenn du
Delphi-Quellcode:
image321.Bitmap.PixelS[x,y]
versuchst?

Es würde mich wundern, wenn man mit
Delphi-Quellcode:
for x:=0 to bild.width-1 do
    for y:=0 to bild.height-1 do
     begin
       if bild[x,y] <> bild2[x,y] then
außerhalb des Bitmaps kommt :wink: .

bigg 17. Jul 2005 13:56

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Zitat:

Aber doch nicht bei einem Bitmap im Speicher.
Wenn es angezeigt wird, schon,
aber das ist in diesem Fall nicht der springende Punkt.

alleinherrscher 17. Jul 2005 14:03

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Ok, ich hatte das Break überlesen, Jan hat recht, sorry! Ich werde natürlich die Routine benutzten, die ist dann echt klasse.. :P tut mir leid...

scp 17. Jul 2005 14:11

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Ich habs grad mal getestet:
- Bei Jans Variante fehlt nur noch das zweite Break, für die zweite Schleife
- Der Ziel-Rect (r) ist nicht definiert, ein Wunder das es bis jetzt geklappt hat, deswegen dürfteauch g32 ins schleudern gekommen sein.
- Bei bild3 sollte PixelFormat definiert werden, bei mir kam sonst EOutOfResources und die Höhe/Breite mit +1
Delphi-Quellcode:
      bild3.PixelFormat := bild.PixelFormat;
      bild3.Width := x_max-x_min+1;
      bild3.height := y_max-y_min+1;
      r := rect(0, 0, bild3.Width, bild3.height);
- Und zum Schluss: try .. finally nicht vergessen.

PS: Jans Variante hat bei mir mit dem einfachen Rechteck-Paint-Beispiel nur 250 msec gebraucht!

alleinherrscher 17. Jul 2005 14:49

Re: Bilder vergleichen -> optimiertes verfahren gesucht!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich hab jetzt Jans Idee verwendet, ist zwar bei meiner alten Kiste nicht viel schneller (immernoch so 2 Sekunden) aber ich sehe ein, dass das die beste Lösung ist für das Problem ;-) Danke@Jan und die anderen!

Aber: *g* Das alte Problem besteht weiter, schaut mal hier. Ich habe zwei Bilder angehängt, die das Programm als Bild3.bmp ausgibt. Es werden von der g32 Lib Pixel mit gleichen Farbwerten als unterschiedlich erkannt.

Das einzige was ich noch nicht gemacht hab ist das "PixelFormat" eingestellt (das kann aber nicht der fehler sein, es gibt kein Pixelformat im TBitmap32)

Gruß, Alleinherrscher


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Seite 2 von 5     12 34     Letzte »    

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