Zahlen aus einem Bild auslesen

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Cyderic

Betreff: Zahlen aus einem Bild auslesen

BeitragSa, Dez 19, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
user posted image

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

BeitragSa, Dez 19, 2009 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Jamagin

Betreff: wg Zahl

BeitragSa, Dez 19, 2009 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 Cool
Bevor du etwas neues beginnst, erledige das alte

Goodjee

BeitragSo, Dez 20, 2009 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Dez 20, 2009 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster:
Das hat er nicht selbstprogrammiert, das ist aus dem Skakes&Fridget Onlinebrowsergame
Hab Ich auch mal ne Weile gespielt.

Jamagin

Betreff: wg. Zahlen aus Bild

BeitragSo, Dez 20, 2009 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@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?? Shocked

Sollte er seine Frage genauer beschreiben! Ich hab ja nur meine Meinung dazu kundgetan.

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

mpmxyz

BeitragSo, Dez 20, 2009 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink )

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

BeitragSo, Dez 20, 2009 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSo, Dez 20, 2009 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist alles Flash basiert, wüsste nicht wie ich da dran kommen soll Smile

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

BeitragSo, Dez 20, 2009 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs mit Speicher direkt auslesen?
So funktionieren eigentlich alle Bots...
Und welcher ist bitteschön nicht verboten?
MFG
 

Cyderic

BeitragSo, Dez 20, 2009 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Danke soweit!
Native ITler

Badudel

BeitragSo, Dez 20, 2009 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group