Autor Beitrag
P@u1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Di 15.12.09 16:46 
Hallo alle!
Wir ihr sehen könnt ist das mein erster Post hier und ich habe nicht besonders viel Erfahrung mit Delphi (aber ein kleines bischen schon ;) ).
Ich muss für ein Projekt Grafiken auslesen können. Es geht darum einen Bot für ein Kartenspiel zu schreiben. Dazu müsste ich es hinkriegen eine Grafik (z.B. aus einem Browser oder einer Anwendung) zu analysieren und z.B. dadurch den Wert von Karten zu identifizieren. Ich vermute schon, dass dies möglicherweise zu schwierig für mich sein könnte. Könnt ihr mir evtl. helfen? Erstmal wäre es wichtig zu wissen, ob dies wirklich einen sehr hohen Schwierigkeitsgrad hat, oder ob ich das nur denke :D und wie man dabei vorgehen kann, oder vll kann mir ja auch jemand ein Programm (/das zugehörige Projekt) eines ähnlichen Programms schicken, damit ich mir das mal angucken kann.
Wenn ihr der Meinung seid, dass ich das lieber bleiben lassen soll, weil es VIEL zu schwierig für mich sein würde, dann könnt ihr mir das auch ruhig sagen! Ansonsten wäre eine Lösungidee hilfreich.
Zu meinen Kenntnissen: Ich habe meine Kenntnisse größtenteils aus der Schulzeit und habe seid ein paar Jahren nicht mehr viel programmiert, aber ich bin durchaus lernfähig :D

Vielen Dank im Voraus!

Paul
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 15.12.09 17:19 
also in diesem Falle hast du die Möglichkeit, einen Screenshot als Referenzbild herzunehmen. Jetzt kannst du die Ähnlichkeit der beiden Bilder in Prozent ausrechnen - hierzu hilft evtl. TBitmap.ScanLine um die Bilder Zeilenweise zu vergleichen - und dann mittels eines Grenzwertes den Wert der Karte herauszufinden.
DHE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37

Win XP, Ubuntu 9.04
Delphi 7 PE; Delphi 2010 Prof (Dank AGS 2009 ;-) )
BeitragVerfasst: Di 15.12.09 17:49 
Da es sich um immer das selbe spiel handelt und die Karten damit wohl immer an der selben Position angezeigt werden, kannst du doch einfach ein kleines Stück der Karte (sagen wir 32x32px des linken oberen kartenrandes nehmen, dann sollte das schon eindeutig sein) und den mit Referenzbildern vergleichen und so den Kartenwert ermitteln. Der Speicheraufwand sollte sich auch bei 52x 32x32 Pixel auch in grenzen halten.

Und da das ganze für ein Projekt ist, kommt es auf die Geschwindigkeit doch nicht an, da wir den Bot ja nicht auf öffentlichen Kartenspielplatformen laufen lassen wollen oder ? :wink: :mrgreen:

edit: ahja und :welcome: im Forum
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 15.12.09 17:51 
Also auch Pixelweises Vergleichen reicht, wenn man nur die richtigen (wenigen) Referenzpixel nimmt. Schwierig ist es erst, wenn das auch bei Verschiedenen Skalierungen (Kartengrößen) funktionieren soll, oder auch bei gedrehten und verschobenen Karten.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 15.12.09 18:09 
Hallo und :welcome: in der Entwickler-Ecke,

Beschreibe bitte mal, was du genau vorhast, und um welches Kartenspiel es sich handelt. Dann kann man evtl. auch eher was zur Komplexität deines Vorhabens sagen.

Generell ist so etwas sehr schwierig und in meinen Augen kaum für ein Neu-Einsteigerprojekt geeignet.

_________________
We are, we were and will not be.
Noob23
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 93

Win XP, Win Server 2003, Win 7, Ubuntu
Delphi 7, c/c++ Dev-c++, µC-8051 Keil, Webdesign Notepad++
BeitragVerfasst: Di 15.12.09 18:51 
Hallo,

wenn ichs richtig versanden habe versuchst du:
Spielkarten aus einem Browser lesen und das ganze dann als autonomen Bot (mit Gewinnberechnungen) laufen zu lassen.

Korregiert mich bitte wenn ich falsch liege, aber steht bei den meisten Anbietern von Online-Poker-Spielen etc. nicht dabei das dies nicht erlaubt/illegal ist?

Grüße
Noob23

_________________
Man streitet zwar noch über die Entstehung der Erde -
Aber über den Untergang sind sich doch schon alle einig...
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Di 15.12.09 18:55 
also es soll eigentlich kein richtiger Bot werden, sondern eine hilfe. Er liest die karten ein und berechnet die optimale spielweise und gibt diese aus. Oder er könnte auch zum Chancen berechnen eingesetzt werden. Ich habe auch nicht vor ihn "professionell" (wie ihr das vorher angedeutet habt) zu nutzen, ein Bot der selbst spielt würde außerdem entdeckt werden, oder?
Noob23
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 93

Win XP, Win Server 2003, Win 7, Ubuntu
Delphi 7, c/c++ Dev-c++, µC-8051 Keil, Webdesign Notepad++
BeitragVerfasst: Di 15.12.09 19:54 
user profile iconP@u1 hat folgendes geschrieben Zum zitierten Posting springen:
also es soll eigentlich kein richtiger Bot werden, sondern eine hilfe. Er liest die karten ein und berechnet die optimale spielweise und gibt diese aus. Oder er könnte auch zum Chancen berechnen eingesetzt werden. Ich habe auch nicht vor ihn "professionell" (wie ihr das vorher angedeutet habt) zu nutzen, ein Bot der selbst spielt würde außerdem entdeckt werden, oder?


Naja eine Hilfe ist es natürlich schon wenn der Bot ohne weiteres Zutun alles selbstständig löst ;)

Die "optimale Spielweise" ist doch nicht anderes als rational die Gewinnchancen abwägen, dafür schmeisst man doch die professionellen Spieler aus den Casino´s!

Wie schaut denn nicht "professionelles" einsetzen eines Bot´s aus, nur abundzu verwenden?

Allein die Frage ob er entdeckt werden würde stellt doch die Sache in ein zwiespältiges Licht?
Falls ich hiermit falsch liege könntest du ja mal die URL angeben, dass sich jeder ein Bild machen kann um was es geht.

Der einfache Teil deines Projekts wäre wohl noch an die Bilddaten zu gelangen...
die Bilbearbeitung/Auswertung + Algorithmus für die Analyse wäre noch ein Stückchen schwerer.

Am besten du gehst ins Casino und versucht dort dein Glück, spart zumindest etliche Stunden programmierarbeit ;)

Grüße
Noob23

_________________
Man streitet zwar noch über die Entstehung der Erde -
Aber über den Untergang sind sich doch schon alle einig...
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 15.12.09 19:56 
Es gibt durchaus Casinos, die das Auslesen und Berechnen der Chancen erlauben.
Die Diskussion gabs hier lezttens schonmal, da könntest du mal gucken.
DHE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37

Win XP, Ubuntu 9.04
Delphi 7 PE; Delphi 2010 Prof (Dank AGS 2009 ;-) )
BeitragVerfasst: Di 15.12.09 22:03 
Das ganze nennt sich Pot Odds und ist erlaubt, da es sich nur um profane Wahrscheinlichkeiten handelt (die jeder Poker Profi im Kopf hat :wink: ). Gibt es tabellen im I-Net zu Hauf. Wenn es dir nur um die Odds gibt, da gabs hier mal im Forum nen schönes Programm dazu. Wenn du nix dagegen hast das ganze immer per Hand einzugeben solltest dir das mal anschauen

Hier ist der Thread dazu.

P.S: Ich bin jetzt einmal davon ausgegangen, das es um Poker geht :D
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Di 15.12.09 22:59 
es handelt sich um eine kostenlose poker software, bei der ausschließlich um spielgeld gespielt wird. Es reicht mir wenn ich die Chancen ausrechnen kann, aber ich möchte das mit einem programm machen, bei dem ich nicht erst etwas eingeben muss, weil es 1. schneller ist und 2. übung bringt im programmieren. Ich hoffe ihr könnt mir ab jetzt bei der umsetzung helfen, statt das projekt an sich in frage zu stellen, wenn ihr probleme damit habt, braucht ihr euch ja nicht beteiligen, wenn nicht dann ist hilfe willkommen.
Wir können jetzt ja erstmal das projekziel außer acht lassen, zunächst brauche ich eine gute möglichkeit, um mit delphi einen screenshot zu erstellen, also so, dass die positionen und farben von verschiedenen pixeln zwischengespeichert werden (denke das ist ne ganz gute möglichkeit, verbesserungsvorschläge sind aber willkommen). Hat dazu jemand einen guten vorschlag?
Vielen Dank schonmal!
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 15.12.09 23:04 
DHE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37

Win XP, Ubuntu 9.04
Delphi 7 PE; Delphi 2010 Prof (Dank AGS 2009 ;-) )
BeitragVerfasst: Di 15.12.09 23:05 
Suche in der Entwickler-Ecke SCREENSHOT

Suche in der Entwickler-Ecke CANVAS COPYRECT

Suche in der Entwickler-Ecke BITMAP VERGLEICHEN

ich denke mal das sollte fürs erste weiterhelfen :lol:
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Di 15.12.09 23:20 
hm auf die idee zu googlen bin ich auch schon gekommen :D

das problem war 1. das ich den screenshot ja eigentlich nicht wirklich in eine datei abspeichern will, sondern nur in den zwischenspeicher und 2. das ich einige teile der vorgeschlagenen codes nicht ganz verstehe. Am besten wäre es wenn mir wer per icq oder so helfen könnte, wenn das wer will ;)
Alternativ zu icq könntet ihr mir auch einen ausgewählten code der diesem zweck dient (z.B. delphi.about.com/od/.../a/wb_scren_shot.htm ) möglichst ausführlich erklären.
Wenn euch das zu viel arbeit ist, kann ich aber auch verstehen, ansonsten vielen dank!
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 15.12.09 23:28 
Wenn man nicht so ein grauenhaft formatiertes Codestück nimmt, versteht man es vielleicht auch besser.
Da z.B.
www.delphi-library.d...stellen_21561,0.html
ist das Erste Ergebnis bei Google nach Delphi+Screenshot.
Ist sogar hier aus dem Forum.
Nimm die Untere Funktion, die schreibt dir das in eine TBitmap. Wenn du das im Allgemeinem nicht verstehst, empfehle ich den Delphi Crashkurs vom Meister.
Spezifische und Differenzierte Fragen werden hier jedoch gerne beantwortet.
DHE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37

Win XP, Ubuntu 9.04
Delphi 7 PE; Delphi 2010 Prof (Dank AGS 2009 ;-) )
BeitragVerfasst: Di 15.12.09 23:31 
Schau mal hier

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure GetScreenShot (var ABitmap : TBitmap); 
var 
  DC : THandle; 
begin 
  if Assigned(ABitmap) then                  // Prüfen ob gültiges Bitmap übergeben wurde 
  begin 
    DC := GetDC(0);                          // Desktop DC holen 
    try 
      ABitmap.Width := Screen.Width;           // Bitmapgrösse den... 
      ABitmap.Height := Screen.Height;         // Bildschirm anpassen 
      BitBlt(ABitmap.Canvas.Handle,            // Dekstop 
             0,0,Screen.Width,Screen.Height,   // in 
             DC,                               // das 
             0,0,                              // Bitmap 
             SrcCopy                           // kopieren 
        ); 
    finally 
      ReleaseDC(0, DC);                        // DC wieder freigeben 
    end
  end
end;


so nach erfolgreichem Aufruf hast du halt in dern als ABitmap übergebenen TBitmap den Screenshot

fürs erste sollte das mal reichen, der Browser muss halt immer offen sein. Wenn du jetzt noch das Fenster-Handle des Browser rausfindest, kannst sogar nur nen Screenshot vom Browser machen. So als nächstes mit Suche in der Entwickler-Ecke COPYRECT die Referenzbitmaps der Karten rausholen und dann einfach vergleichen.

mit den erfassten karten Odds berechnen, Ausgabe und fertig ist. Das schwierigste an dem Projekt ist wohl das Erfassen und Auswerten der Karten.
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: Sa 09.01.10 22:34 
So, vielen dank für eure bisherige Hilfe. Bisher funktioniert alles sehr gut.
Jetzt habe ich allerdings ein Problem:

Manchmal kommt es vor, dass Karten gedreht dargestellt sind.

Ich habe auch schon eine Funktion erstellt mit der ich ein Bild drehen kann.
Allerdings bin ich mir nicht sicher, ob ich auf diese Weise wirklich das richtige Bild rauskriegen kann.
Bisher habe ich das so gemacht, dass ich von jeder Karte zunächst ein Bild gespeichert habe und während das Programm läuft, vergleicht er mit diesen Bildern.
Allerdings würde das erstellen der Bilder viel zu lange dauern, wenn ich das für verschiedene Drehungen auch noch machen muss.
Ich arbeite im Moment an einem Programm, was automatisch verschiedene Drehungen ausprobiert und dann abgleicht (mit Verschiebungen statt Drehungen funktioniert es bereits!).
Allerdings bin ich mir ziemlich unsicher ob das mit dem Drehen funktionieren wird, z.B. kann es sein, dass die Karten aus der Software wenn sie bei anderen Spielern liegen nicht durch eine Drehung der normalen Karten konstruiert wurden, es könnten stattdessen z.B. auch eigene Bilder sein.

Hat jemand eine andere Idee, wie ich dieses Problem lösen kann?

edit: falls ihr euch mein problem nicht gut vorstellen könnt, kann ich ein paar bilder reinsetzen, die das verdeutlichen
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 09.01.10 23:27 
Wenn freie, beliebige Drehung vorkommt, wird es schon recht schwer.
Komplexer wird es dann noch, wenn Anti-Aliasing dazukommt.
Wenn es nur um bestimmte Feste Schritte geht, um die gedreht wird, müsstest du das halt manuell machen.
Ein Beispielbild wäre also prinzipiell nicht schlecht.
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: So 10.01.10 00:47 
So hier mal ein Beispielbild dazu:

123

Das Bild links oben zeigt eine normale Hand mit zwei Karten an (nur die Pik Dame ist relevant erstmal). Rechts daneben befindet sich eine gedrehte Hand (ganz leicht nach links gedreht), die auch eine Pik Dame hat.

In der unteren Reihe sieht man jeweils den Aussschnitt aus der Karte, der zum Vergleich benutzt wird.
(Die Bildgrößen sind nur Pi mal Daumen mit Paint ausgeschnitten, das soll nur zur veranschaulichung dienen, nicht, damit ihr mit diesen Bildern rumrechnen könnt :D).

Irgendwie sieht der Unterschied zwischen den beiden unteren Bildern gar nicht mal so groß aus. Aber ich habe es bisher so gemacht, dass eine Übereinstimmung von mindestens 98% benötigt wird, da ich (fast) exakt gearbeitet habe.
Ich werd dann mal ein paar tests machen, falls ihr keine weiteren guten Ideen habt.
Einloggen, um Attachments anzusehen!
P@u1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 117



BeitragVerfasst: So 10.01.10 15:38 
so, ich hab das Programm, das die Position und die Verschiebung raussuchen soll jetzt soweit fertig gestellt, nur leider gibt es einige Probleme. Ich werde jetzt zunächst ein paar Beispielbilder mit denen ich arbeite posten und dann einige Teile meines Codes. Ich finde den Fehler leider nicht. Und wundert euch nicht über meine teils komischen funktionsbezeichnungen :D

1 2 3

links: der ganz normale Ausschnitt mit dem normalerweise vergleichen wird.
Mitte: das gleiche Bild ein wenig verschoben in x- und y- Richtung (mit meinem vorherigen Programm hab ich es bereits hingekriegt, die Verschiebungskoordinaten automatisch zu bestimmen)
Rechts: Das Bild diesmal verschoben und gedreht

Mit dem neuen Programm funktioniert es nicht einmal mehr, das nur verschobene Bild rauszufinden.

So jetzt zum derzeitigen Code:

Erstmal das Prinzip:

Ich lade zunächst in die Variable Bild 1 das Standard Bild (links) rein und in Bild 2 ein Bild in dem gesucht werden soll.
Dann werden alle möglichen Verschiebungen und Drehungen durchgegangen (drehung atm nur von 0 bis 11 Grad in Ganzgradschritten, aber es reicht, weil das Testbild nur um 10 Grad gedreht wurde), solange bis in einem Ausschnitt aus Bild 2 das Bild1 gefunden wird bzw. ein Bild was dem sehr ähnelt.
Im Moment kommt allerdings nur eine Übereinstimmung von ca. 50% zustande, auch wenn ich das NUR verschobene Bild verwende, bei dem ich mit meinem vorherigen Programm bereits eine 100%ige Übereinstimmung hatte.
In diesem neuen Programm kam größtenteils nur das Element der Drehung hinzu.


Die Prozedur die alles in Gang setzt (Button4):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TfrmMain.Button4Click(Sender: TObject);
var
tempPoint: TPoint;
tempresult: TScanResult;
Width, Height: integer;
RotatedImage: TBitMap;
begin

  tempresult:=DrehVerschiebungsscan(Bild1,Bild2);   //Die Verschiebungskoordinaten und der Winkel werden bestimmt
  tempPoint:=tempresult.Koords;
  frmMain.Caption:=floattostr(tempresult.Winkel);

  Width:=Bild1.Width;
  Height:=Bild1.Height;

  RotatedImage:=TBitMap.Create;

  RotatedImage.Canvas.CopyRect(Rect(0,0,Width,Height),
  Bild2.Canvas,Rect(tempPoint.X, tempPoint.Y,
  tempPoint.X+Width,tempPoint.Y+Height));

  RotatedImage:=Rotate(RotatedImage ,-tempresult.Winkel);

  Image3.Picture.BitMap:=RotatedImage;  // das gefundene Bild wird in Image3 gemalt (zur zusätzlichen Kontrolle)

  RotatedImage.Free;
end;


Drehverschiebungsscan: ( :D )

Diese Funktion geht alle Verschiebungen durch und bestimmt die Übereinstimmungen.
Durch den Aufruf von Drehevaluate werden auch noch verschiedene Winkel versucht.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
function DrehVerschiebungsscan(Bild1,Bild2 : TBitMap): TScanResult;
var
  i,k: Integer;
  bmp : TBitMap;
  Width: integer;
  Height: integer;
  Canv: TCanvas;
  Match: array[0..100of ExtendedArray;
  tempPoint: TPoint;
  tempresult: TEvalResult;
  bmp1,bmp2: TBitMap;
begin

  bmp1:=Bild1;
  bmp2:=Bild2;

  for i := 0 to 100 do
  begin
    for k := 0 to 100 do
    Match[i,k]:=0;
  end;

  Width:=bmp1.Width;
  Height:=bmp1.Height;
  Canv:=bmp2.Canvas;

  bmp:=TBitMap.Create;
  bmp.Width:=Width;
  bmp.Height:=Height;


  for k := 0 to bmp2.Height-Height do
  begin

    for i := 0 to bmp2.Width-Width do
    begin
      bmp.Canvas.CopyRect(Rect(0,0,Width,Height), Canv,Rect(i,k,i+Width,k+Height));

      tempresult:=DrehEvaluate(bmp1,bmp);
      Match[i,k]:=tempresult.Match;
    end;
  end;

  tempPoint := Highest2dim(Match);

  bmp.Canvas.CopyRect(Rect(0,0,Width,Height),
  Canv,Rect(tempPoint.X, tempPoint.Y,tempPoint.X+Width, tempPoint.Y+Height));

  ShowMessage(floattostr(Evaluate(bmp,bmp1))+'% match');
  bmp.Free;

  result.Koords:=tempPoint;
  result.Winkel:=tempresult.Winkel;

end;


Drehevaluate:

Bestimmt den Winkel mit der höchsten Übereinstimmung

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function DrehEvaluate(b1,b2 : TBitmap) : TEvalResult;
var
tempMatch: array[0..11of Extended;
tempbmp: TBitMap;
  i: Integer;
begin

  for i := 0 to 11 do
  begin
    tempbmp:=Rotate(b2,-i);
    tempMatch[i]:=EvaluateLila(tempbmp,b1);
    tempbmp.free;
  end;

    i:=Highest(tempMatch);
    result.Match:=tempMatch[i];
    result.Winkel:=i;

end;


EvaluateLila xD :

Vergleicht 2 Bilder Pixelgenau und berechnet die Übereinstimmung.
Pixel die bei dem ersten Bild lila sind, werden immer als Übereinstimmend gewertet (bei der Drehung geht ein kleiner Bereich des Bildes verloren, der nicht mitberücksichtigt werden soll)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
function EvaluateLila(b1,b2 : TBitmap) : extended;
type
  TPixArray = Array[1..3of Byte;
var
  SimilarR,SimilarG,SimilarB,i,x: integer;
  a,b : ^TPixArray;
begin

    b1.PixelFormat:=pf24bit;
    b2.PixelFormat:=pf24bit;

    SimilarR := 0;
    SimilarG := 0;
    SimilarB := 0;
  for i := 0 to b1.height-1 do
    begin
      a := b1.ScanLine[i];    //Bild1 scannen
      b := b2.ScanLine[i];    //Bild2 scannen
      for x := 0 to (b1.Width-1do
      begin
        if (a^[1]=255and (a^[2]=68and (a^[3]=187then
        begin
          inc(SimilarR);
          inc(SimilarG);
          inc(SimilarB);
        end

        else

        begin

          if a^[1] = b^[1then          //R-Werte vergleichen
            inc(SimilarR);               //wenn gleich, Ähnlichkeitsanzahl erhöhen

          if a^[2] = b^[2then          //G-Werte
            inc(SimilarG);

          if a^[3] = b^[3then          //B-Werte
            inc(SimilarB);

        end;

          inc(a);                        //nächster Pixel...
          inc(b);

      end;
    end;

  result:=100*(SimilarR+SimilarG+SimilarB)/(3*((b1.Width)*(b1.Height)));
end;


Highest bzw. Highest2dim (steht für zweidimensional) sind funktionen, die das höchste Element aus arrays raussucht (bei bedarf kann ich die auch posten, aber denke das ist auch so schnon mehr als genug)

Und Rotate dreht ein Bild um einen bestimmten Winkel und füllt alles was danach nicht mehr abgedeckt ist mit lila aus :D (durch die Drehung bleibt ein kleiner Bereich leer).

Ich hoffe mal das das nicht viel zu lang war :D und dass ihr das halbwegs nachvollziehen könnt.
Ich finde leider einfach den Fehler nicht, habe schon ziemlich viel probiert :D
Falls wer nen Vorschlag hat, bitte melden!
Achja: Macht euch keine Sorgen über die Laufzeit, es dauert bei mir nur ein paar Sekunden das durchlaufen zu lassen, solange das Bild in dem gesucht wird nicht zu groß ist.
Einloggen, um Attachments anzusehen!