Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kleine Bitmap in einer größeren Bitmap finden (https://www.delphipraxis.net/181098-kleine-bitmap-einer-groesseren-bitmap-finden.html)

rhodan 16. Jul 2014 02:03

Kleine Bitmap in einer größeren Bitmap finden
 
hi!

Ich möchte ein Poker-Tool schreiben wie den "Holdem Indicator", bedeutet ein tool das mir beim pokerspielen anzeigt wieviel gewinnchance meine aktuelle hand hat, vielleicht verglichen mit den noch im spiel befindlichen karten etc. Also quasi die Anzeige die auch beim DSF Poker immer angezeigt wird und mir eine übersicht gibt wie gut meine chancen stehen.

für mich stellt sich jetzt die frage wie ich das programm mein eigenes Blatt auslesen lasse.
Ich weiß wie ich einen screenshot von meinem bildschirm mache und bestimmte pixel nach farben absuche und so mein eigenes blatt identifiziere...allerdings finde ich das recht aufwendig, fehlerlastig, vor allem wenn auch noch der flop, turn, river etc ausgelesen werden sollen...ein riesen haufen koordinaten.

einfache variante wäre wenn ich ein screenshot von jeder karte schon im programm hätte und dieses mit dem screenshot meines bildschirms verglichen werden würde..ich finde nur zu dem thema nichts..ich habe den sourcecode in c++ gefunden was ich leider nicht beherrsche. ;D

Code:
procedure TForm1.Button2Click(Sender: TObject);
var
game_hwnd : hwnd;
prect:Trect;
posx,posy:integer;
dc:hdc;
AColor : Array[1..4] of Byte;

begin

game_hwnd := findwindow(nil,'POKER - mozilla firefox');
setforegroundwindow(game_hwnd);
setfocus;
postmessage(game_hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,0);
GetWindowRect(game_hwnd, prect);
prect.Top := prect.Top + GetSystemMetrics(SM_CYCAPTION);
width:=prect.Right - prect.left;
height:=prect.Bottom - prect.Top;
posx:=prect.left;
posy:=prect.top;

   DC := GetDC(game_hwnd);

 
  DWord(AColor) := GetPixel(dc,406,409);
 //HERZ KÖNIG
  if (AColor[1] > 220) and (AColor[2] > 95) and (AColor[3] > 190) then
    ....
das ist jetzt nur ein beispiel wie ich die farben auf dem screenshot auslesen würde..hat jemand nen tip wie ich einfach ein bild aus meinem timage einlesen kann?

danke

nuclearping 16. Jul 2014 03:06

AW: Kleine Bitmap in einer größeren Bitmap finden
 
Schau mal hier: http://www.experts-exchange.com/Prog..._23981530.html

Der benutzt aber TBitmap mit Canvas.Pixels. Also genau der Flaschenhals.

Das Ganze könnte man beschleunigen, indem man entweder statt mit
Delphi-Quellcode:
TBitmap
mit
Delphi-Quellcode:
TBitmap32
(Graphics32) arbeitet oder die Funktion auf
Delphi-Quellcode:
ScanLine
umstellt.

Medium 16. Jul 2014 08:49

AW: Kleine Bitmap in einer größeren Bitmap finden
 
Das Stichwort ist (Kreuz-)Korrelation.

Zwei Tipps:
1) Ich weiss zumindest von Poker Stars, dass sie regelmäßig die Tischgrafiken und die Positionen der Elemente minimal ändern. Dies soll wohl "Bots" stören, die pixelgenaue Bilder an festen Positionen erwarten. Letzteres hättest du mit obigem abgedeckt, man müsste dann nur etwas tolerant bei den eigentlichen Grafikschnipseln sein.
2) Solche Helferlein sind glaube ich in der Grauzone dessen, was die Pokerräume so erlauben. Und ja, die meisten haben Bot-Detection-Maßnahmen. Poker Stars geht zwar nur so weit, unplausibel schnell und weit auseinander gemachte Klicks bzw. Mausbewegungen zu melden, aber im Grunde hindert niemand einen daran die APIs zum Screenshotten zu hooken und bei regelmäßiger Nutzung dies auch zu munieren.
Lass deine Bankroll also nicht zu sehr anschwellen, nicht dass deine Reichtümer dann plötzlich doch gesperrt werden =)

rhodan 16. Jul 2014 14:07

AW: Kleine Bitmap in einer größeren Bitmap finden
 
ich werde mir die korrelation mal ansehen, danke.

Der holdem Indicator der sogar statistiken über spieler etc trackt ist in über 200 der grössten onlinepokerseiten (inkl pokerstars) nicht nur erlaubt - sie bewerben solche tools sogar. statistiken zu errechnen ist schon lange keine grauzone mehr...online so ziemlich gang und gebe :wink::wink:

Aphton 16. Jul 2014 16:46

AW: Kleine Bitmap in einer größeren Bitmap finden
 
Do you even search bro?

Edit: Zum eigentlichen Problem und nicht zu der gefragten Lösung..
Ich würd da ganz anders vorgehen:
Zuerst würd ich nach einer Schnittstellen- bzw. Spielprotokollbeschreibung vom Hersteller suchen -> existiert sie nicht, so würd ich das Protokoll reverse engineeren.
Als nächstes würd ich mich den Netzwerk Trafic mithören und die mir wichtigen Informationen extrahieren.

rhodan 16. Jul 2014 19:36

AW: Kleine Bitmap in einer größeren Bitmap finden
 
klar ist das lesen der informationen die der Client erhält um den tisch etc grafisch anzuzeigen der perfekteste weg...allerdings auch der schwierigste - von einer encryption mal ganz zu schweigen...das hab ich mir gleich abgeschminkt ;D

dein link sieht ganz interessant aus, ich probiere damit nachher mal rum wenn ich zuhause bin. eine "leichte" lösung scheint es für dieses "problem" offensichtlich nicht zu geben :o

was haltet ihr von der idee den gemachten screenshot in einen string umzuwandeln und das gesuchte bitmap auf diesem wege via stream zu vergleichen?


EDIT: das mit FASTNCC zu lösen, vlt über OpenCV scheint mir die beste möglichkeit zu sein.?!

Sinderion 16. Jul 2014 23:22

AW: Kleine Bitmap in einer größeren Bitmap finden
 
Bei Pokerstars gäbe es ein Logfile, dass man auslesen könnte.

rhodan 16. Jul 2014 23:48

AW: Kleine Bitmap in einer größeren Bitmap finden
 
wenn ich ehrlich bin gehts mir gar nicht um irgendein onlinepoker in erster linie, ich versuche mich an einem singleplayer Holdem...OpenCV bietet die möglichkeit des "bildervergleichs" auf der basis von Template Matching..ich hab allerdings probleme das zu installieren oO
ich gehe mal von meiner unfähigkeit aus bzw mangelnden kenntnissen.

http://www.delphipraxis.net/181114-o...ml#post1265727

Namenloser 17. Jul 2014 01:32

AW: Kleine Bitmap in einer größeren Bitmap finden
 
OpenCV ist dafür absolut mit Kanonen auf Spatzen geschossen. Erspar dir den Aufwand es zum Laufen zu bringen und implementier die Suche selbst. So schwer ist das nun auch nicht (vorausgesetzt, das gesuchte Bitmap ist 1:1 so im Screenshot enthalten und nicht irgendwie verzerrt o.ä.).

Medium 17. Jul 2014 08:26

AW: Kleine Bitmap in einer größeren Bitmap finden
 
Und ob du jetzt in einem String oder einem Bild nach Mustern suchst, ist gehoppst wie gesprungen. Das läuft im Wesentlichen auf dasselbe Verfahren hinaus, und bei Strings wirst du ggf. Probleme mit #0 bekommen. Zudem würdest du dir den zweidimensionalen Zusammenhang kaputt machen, wüsstest also nicht mehr, welche Zeilen/Spalten unter-/nebeneinander sind, und könntest bestenfalls noch 1px dicke "Subbilder" finden.
Das von Aphton verlinkte Verfahren ist mit die einfachste Variante die man ansetzen könnte, und böte sogar die Option mit Toleranz vorzugehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.

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