Zahlen aus einem Bild auslesen
Übersicht

CydericBetreff: Zahlen aus einem Bild auslesen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich wollte mal sehen ob jemand von euch mir etwas Inspiration geben kann. Ich möchte einen Algo schreiben, der mir aus einem Bild mit fester Größe verschiedene Zahlen ausliest. Die Schriftart und Schriftgröße der Zahlen ist immer gleich, auch die Koordinaten sind gleich. Dennoch weiss ich nicht so recht wie ich das machen soll. Hier ein Ausschnitt: ![]() Die rechten Werte, brauche ich, bis auf Schaden und Leben, nicht (kann ich dann selbst ausrechnen). Ich hatte eigentlich gedacht, ich mache mir ein Bild von jeder Ziffer, und lasse sie dann mit Read Pixel vergleichen. Allerdings stoße ich da schon bei der Theorie auf zwei Probleme: 1. Der Hintergrund bei den Zahlen weicht teilweise stark ab 2. Wie soll ich heraus finden, wie viele Ziffern eine Zahl hat? Vielleicht hat jemand von euch Ideen und Vorschläge. Danke! |
||
Native ITler |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
eine zahl hat keine weitere ziffer mehr wenn a pixel lang keine neue ziffer kommt
zum hintergrund: hier musst du wohl deine vergleichsbilder so bestimmen, dass nur pixel die komplett gelb nicht gelbblau sind verglichen werden |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn der Zeichensatz und die Größe immer gleich ist, lässt sich was machen.
Denn, wo die Zahlen stehen, scheint ja der Hintergrund nicht durch. Außerdem ist wohl anzunehmen, das der Kontrast zwischen Zahl und Umgebung trotz unterschiedlicher Hintergründe recht hoch sein dürfte. Mach je ein Bild aus einer Zeile. Mach aus jedem Bild ein echtes Schwarz-Weiss-Bild (nur 0 oder 1), indem Du den Kontrast erhöhst. (helles->heller, dunkles -> dunkler) Dann wird das Bild dort zerschnitten, wo eine senkrechte y-Linie aus komplett schwarzen Pixeln besteht. Damit trennst Du es nach Ziffern. Verkleinere jedes Ziffer-Bild, bis keine reine schwarze Pixelreihe mehr bleibt. (Randbemerkung:die "1" sollte sich jetzt schon an der Bildgröße erkennen lassen) Vergleiche jetzt das Zifferbild mit allen 10 ebenso erstellten Referenz-Ziffer-Bilder "1" bis "0" und zähle die Ähnlichenkeiten. z.b. mit AND verknüpfen und die "Fehlerpixel" zählen. Die richtige Ziffer ist die, bei deren Vergleich sehr wenige Fehlerpixel übrigbleiben. |
||
![]() |
JamaginBetreff: wg Zahl |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Cyderic
hm, das ist Schwachsinn, wenn du das so lösen willst. Besser wäre den Hintergrund wie auch die Texte und Zahlen unabhängig zu gestalten. Sowie du ein Tileset benutzt kannst du das auch mit Zahlen machen oder auf BlitzBasic Deutsch AnimImage... (Jede Ziffer der Zahl in ein Animationsframe packen) Da ersparst dir einen Haufen an Berechnungen, denn Zahlen gibt es nur von 0-9. Wäre auf jedenfall einfacher zu lösen. lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: Wenn der Zeichensatz und die Größe immer gleich ist, lässt sich was machen.
Denn, wo die Zahlen stehen, scheint ja der Hintergrund nicht durch. Außerdem ist wohl anzunehmen, das der Kontrast zwischen Zahl und Umgebung trotz unterschiedlicher Hintergründe recht hoch sein dürfte. das ist optimistisch, wenn du pech hast macht die kantenglättung der schrift dir da einen strich durch die rechnung wenn du den schwellenwert für den kontrast falsch setzt jamagin, dein kommentar mcaht überhaupt keinen sinn.... |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Jamagin:
Hab ich da jetzt Cyderik völlig falsch verstanden? Ich denke er sucht was, wo er die Zahlen aus fremden Bilder "scannen" will. @Cyderik: Sind das Zahlen aus einem selbprogrammierten Programm von Dir? Oder Zahlen aus einer fremden Anwendung? Willst Du die Zahlen irgendwie mathematisch weiterverarbeiten oder brauchst Du sie als Zeichensatz für Dein eigenes Spiel? @Goodjee: Das ist egal, dieser Fehler wird ja bei allen Ziffern gleich intensiv sein. Das richtige Ziffer-Bild wird trotzdem die höchste Punktzahl erreichen |
||
- Zuletzt bearbeitet von Midimaster am So, Dez 20, 2009 10:28, insgesamt einmal bearbeitet
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn di grösse und die Schriftart bekannt ist, würde ich pro Stelle 2 bis 3 Pixel auslesen. Diese würde ich so setzen, dass es jeweils für eine Zahl eine bestimme Kombination hat. | ||
Play Satyr! |
![]() |
The Shark |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Midimaster:
Das hat er nicht selbstprogrammiert, das ist aus dem Skakes&Fridget Onlinebrowsergame Hab Ich auch mal ne Weile gespielt. |
||
![]() |
JamaginBetreff: wg. Zahlen aus Bild |
![]() Antworten mit Zitat ![]() |
---|---|---|
@goodjee
wieso macht mein Kommentar keinen Sinn? Ich sehe auch keinen Sinn darin, Zahlen aus einem Bild auszulesen, wenn man sowas einfacher lösen kann!! Hab ich was falsch verstanden? Wenn er Zahlen aus Bilder auslesen will warum macht er das nicht mit Photoshop?? ![]() Sollte er seine Frage genauer beschreiben! Ich hab ja nur meine Meinung dazu kundgetan. lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe die Vermutung, dass er eine Art Bot dafür programmieren möchte.
Zum Erkennen der Zahlen: Der Kontrast zwischen Hintergrund und Schrift sollte so weit erhöht werden, bis es nur noch zwei verschiedene Farben gibt. Dann könnte man dort, wo man eine Zahl vermutet, die Pixel des Bildes in Linien durchgehen und vergleichen, ob jeder Pixel der Linien zum Zeichen und nicht zum Hintergrund gehört. Dafür müssen allerdings noch "Zahlenlinien" bestimmt werden. Wenn die meisten Pixel der Linien richtig sind, dann hat man die gesuchte Zahl gefunden. mfG mpmxyz P.S.: Ich kann es auch noch einmal ausführlicher erklären, wenn jemand es nicht 100%ig verstanden hat. |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
so wie es aussieht sind die Farben ziemlich monochromatisch, wenn du weisst was das für eine Farbe ist, könntest du den Rest schonmal rausfiltern, dann hast du ein Problem weniger. Danach könnte man versuchen, für jede Zahl (bei bekanntem Zeichensatz) eine Art Schablone zu machen und diese Schrittweise über das Bild laufen lassen, wos passt wird die Zahl gespeichert (mit Position und Zahlenwert). Wenn du alle Zahlen gefunden hast, kannst du Zahlen suchen die nahe zusammen sind und sie zusammensetzen (zahl=zahl+neueZahl*10^stelle). Das ist so eine grobe Idee wie ich es versuchen würde. Die grösste Schwierigkeit liegt darin, zwischen Filter und aktueller Auslese eine genaue Korrelation zu erstellen :/ Naja, vielleicht hilfts. MfG, Darth |
||
Diese Signatur ist leer. |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier mal was, wie man den Kontrast erhöht. Ihr müsst für das Beispiel genau das Bild von Cyderik als "color.png" speichern.
Ich hab das ganze künstlich gebremst, damit man sieht wie es arbeitet. (nicht dass mir einer jetzt sagt: das geht aber schneller ![]() Code: [AUSKLAPPEN] Graphics 400,300
Bild = LoadImage("color.png") ; erhöht den Kontrast eines Bildes an der Stelle X,Y ; Alle Helligkeit unter dem Grenzwert 127 wird weiss, alles darüber wird schwarz MachSchwarzWeissBild Bild,105,3,127 WaitKey End Function MachSchwarzWeissBild(locBild,X%,y%,Grenzwert%) Cls DrawImage locBild,0,0 Flip True GrenzWert=GrenzWert*3 ; untersucht wird zu Testzwecken nur der Bereich von 60x20 pixeln: For i=x To x+60 For j=y To y+20 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<Grenzwert Then Color 255,255,255 Else Color 1,1,1 EndIf Plot i,j Next Flip True Next End Function |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier nun Teil 2:
EDIT #1: code verbessert 16:02 Uhr Die folgende Funktion verkleinert den Bildausschnitt um eine Zahl auf das Minimum und trennt die Ziffern auseinander. Ihr Aufruf erfolgt in der Hauptschleife nach... Code: [AUSKLAPPEN] ...
MachSchwarzWeissBild Bild,105,3,127 ; verkleinert den Bildschirmausschnitt auf die Grenzen der Ziffern OptimaleGroesseFinden 105,3 WaitKey ... 2x das gleiche, der Bildausschnitt wird von links nach rechts, dann von oben nach unten verkleinert. Der Algo springt auch an, wenn 0 bis 2 schwarze Pixel gefunden werden. Das entfernt noch einige Pixel der Kantenglättung. Code: [AUSKLAPPEN] Function OptimaleGroesseFinden (X%,Y%)
For i=x To x+60 Gefunden=0 For j=y To y+20 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<255 Then Gefunden=Gefunden+1 EndIf Next If Gefunden<3 Then Color 255,0,0 Line i,y,i,y+20 EndIf Next Gefunden=0 For j=y To y+20 Gefunden=0 For i=x To x+60 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<255 Then Gefunden=Gefunden+1 EndIf Next DebugLog j-y + " " + gefunden If Gefunden<3 Then Color 255,0,0 Line x,j,x+60,j EndIf Next Flip End Function |
||
Cyderic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die ganzen Antworten, und danke für die Mühe Midimaster.
Wie ebreits schon fest gestellt wurde: Das Spiel ist natürlich nicht von mir, sonst bräuchte ich ja nicht so einen Aufwand machen. Ziel ist es, die Zahlen auszulesen um dann mit ihnen weiter arbeiten zu können (Bot trifft es ganz gut). Das ganze über den Weg, weil er nicht zurück verfolgt werden kann. Es gibt einen Bot der das über den Netzverkehr macht, kann man aber zurückverfolgen.. Jetzt muss ich nur noch Midis Code verstehen und ergänzen. |
||
Native ITler |
![]() |
Starwar |
![]() Antworten mit Zitat ![]() |
---|---|---|
Versuche doch mal aus den Daten die ankommen das nötige zu extrahieren. Nacher steht was drin wie:
Code: [AUSKLAPPEN] <img src="3.png alt="3"/>
oder sowas. MFG |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum ist diese Rückverfolgung nicht gewünscht? | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Cyderic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist alles Flash basiert, wüsste nicht wie ich da dran kommen soll ![]() PS. Logischerweise ist es verboten mit einem externen Programm auf die Server zuzugreifen, und Daten abzufragen insbesondere weil die ACC-Daten in Klartext übertragen werden. Deswegen wurde dieser Bot von den Entwicklern verboten. Deswegen mag ich versuchen, es nur über das Bild zu schaffen. Es gibt auch sonst noch einige Programme, aber da muss man es eben von Hand eintragen. Die sind aber auch alle von den Spiel-Entwicklern zugelassen. |
||
Native ITler |
![]() |
Starwar |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie wärs mit Speicher direkt auslesen?
So funktionieren eigentlich alle Bots... Und welcher ist bitteschön nicht verboten? MFG |
||
Cyderic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jetzt weich ma nich vom Tehma ab, sonst wird der Thread noch geschlossen weil es um Bot-Programmierung geht, was es aber nie tun sollte..
Edit: Am Ende sieht das dann so aus: Code: [AUSKLAPPEN] Graphics 400,300,32,2 Bild = LoadImage("color.png") ; erhöht den Kontrast eines Bildes an der Stelle X,Y ; Alle Helligkeit unter dem Grenzwert 127 wird weiss, alles darüber wird schwarz Cls DrawImage Bild,0,0 ;Stärke MachSchwarzWeissBild 105,3,127 OptimaleGroesseFinden 105,3 ;Geschick MachSchwarzWeissBild 105,37,127 OptimaleGroesseFinden 105,37 ;Int MachSchwarzWeissBild 105,67,127 OptimaleGroesseFinden 105,67 ;Ausdauer MachSchwarzWeissBild 105,97,127 OptimaleGroesseFinden 105,97 ;Glück MachSchwarzWeissBild 105,130,127 OptimaleGroesseFinden 105,130 WaitKey End Function MachSchwarzWeissBild(X%,y%,Grenzwert%) Flip Grenzwert=Grenzwert*3 ; untersucht wird zu Testzwecken nur der Bereich von 60x20 pixeln: For i=X To X+60 For j=y To y+20 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<Grenzwert Then Color 255,255,255 Else Color 1,1,1 EndIf Plot i,j Next Next Flip End Function Function OptimaleGroesseFinden (X%,Y%) For i=X To X+60 Gefunden=0 For j=Y To Y+20 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<255 Then Gefunden=Gefunden+1 EndIf Next If Gefunden<2 Then Color 255,0,0 Line i,Y,i,Y+20 EndIf Next Gefunden=0 For j=Y To Y+20 Gefunden=0 For i=X To X+60 GetColor(i,j) Wert=ColorRed()+ColorGreen() + ColorBlue() If Wert<255 Then Gefunden=Gefunden+1 EndIf Next DebugLog j-Y + " " + gefunden If Gefunden<3 Then Color 255,0,0 Line X,j,X+60,j EndIf Next Flip End Function Ich musste bei der ersten Funktion der Optimalen Größe die Toleranz von 3 auf 2 senken, da sonst die 4er nicht richtig erkannt werden. Könnt es ja mal auf 3 zurück stellen um zu sehen was ich meine. Jetzt fehlt "nur" noch die Erkennung ![]() Danke soweit! |
||
Native ITler |
![]() |
Badudel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein neuer Denkansatz:
Du kennst die genaue Position der Schrift, du hast die Schriftart und es gibt nur Ziffern von 0-9. Warum schneidest du dann nicht das Bild genau dort aus, wo die Ziffer ist und ließt dieses Bild in ein Dim-Feld ein. Anschließend setzt du inner Schleife die einzelnen Ziffern drauf und vergleichst die neuen Farbwerte mit dem Feld. Hast du die richtige Nummer, so wirst du keinen Unterschied finden. Ist das verständlich? Ich werd mal schauen, wie schnell diese Variante arbeiten würde. Gruß! |
||
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group