OCR = Bild zu text - Problem!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

OCR = Bild zu text - Problem!

Beitrag von onny »

Was stimmt hier nicht.... bitte helft mir:
http://rapidshare.de/files/22385470/test.rar.html
Habe ein Bild und möchte es in Text umwandeln... es kommt aber was anderes raus...

Code: Alles auswählen

Procedure.s openURL(url.s, OpenType.b) 
  isLoop.b=1 
  INET_RELOAD.l=$80000000 
  hInet.l=0: hURL.l=0: Bytes.l=0 
  Buffer.s=Space(2048) 
  
  hInet = InternetOpen_("PB@INET", OpenType, #Null, #Null, 0) 
  hURL = InternetOpenUrl_(hInet, url, #Null, 0, INET_RELOAD, 0) 
  
  Repeat 
    
    Delay(1) 
    InternetReadFile_(hURL, @Buffer, Len(Buffer), @Bytes) 
    If Bytes = 0 
      isLoop=0 
    Else 
      res.s = res + Left(Buffer, Bytes) 
    EndIf 
  Until isLoop=0 
  InternetCloseHandle_(hURL) 
  InternetCloseHandle_(hInet) 
  ProcedureReturn res 
EndProcedure 
Structure CODE
  string.s
  *buffer.LONG
EndStructure
Global anzahlZeichen
anzahlZeichen = 25 

Dim code.CODE(anzahlZeichen-1)
Procedure GetImageMem(Image)
  
  hBmp = UseImage(Image) 
  w    = ImageWidth() 
  h    = ImageHeight() 
  hdc  = StartDrawing(ImageOutput())
  *mem = AllocateMemory(w*h*4)
  
  bmi.BITMAPINFO
  bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth  = w
  bmi\bmiHeader\biHeight = h
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  GetDIBits_(hdc,hBmp,0,h,*mem,@bmi,#DIB_RGB_COLORS)  
  
  StopDrawing()
  
  ProcedureReturn *mem
EndProcedure
Procedure.s GetString(codebild)
  For i = 0 To 7 ;// 3 bilder
    *buffer.LONG = GetImageMem(GrabImage(codebild,#PB_Any,15*i,0,7,10))
    old  = *buffer 
    
    For j = 0 To anzahlZeichen - 1  
      old2 = code(j)\Buffer
      
      For o = 1 To 225 
        If *buffer\l = code(j)\Buffer\l
          treffer + 1
        EndIf 
        *buffer + 4
        code(j)\Buffer + 4
      Next
      
      *buffer        = old
      code(j)\Buffer = old2
      If treffer > 100
        codestr.s + code(j)\string
      EndIf 
      
      treffer = 0
      
    Next
    FreeMemory(old)
  Next 
  
  ProcedureReturn codestr
EndProcedure
code(0)\string = "a" : LoadImage(0,"a.bmp") 
code(0)\Buffer = GetImageMem(0)
code(1)\string = "b" : LoadImage(1,"b.bmp")
code(1)\Buffer = GetImageMem(1)
code(2)\string = "c" : LoadImage(2,"c.bmp") 
code(2)\Buffer = GetImageMem(2)
code(3)\string = "d" : LoadImage(3,"d.bmp") 
code(3)\Buffer = GetImageMem(3)
code(4)\string = "e" : LoadImage(4,"e.bmp") 
code(4)\Buffer = GetImageMem(4)
code(5)\string = "f" : LoadImage(5,"f.bmp") 
code(5)\Buffer = GetImageMem(5)
code(6)\string = "g" : LoadImage(6,"g.bmp")
code(6)\Buffer = GetImageMem(6)
code(7)\string = "h" : LoadImage(7,"h.bmp") 
code(7)\Buffer = GetImageMem(7)
code(8)\string = "i" : LoadImage(8,"i.bmp") 
code(8)\Buffer = GetImageMem(8)
code(9)\string = "j" : LoadImage(9,"j.bmp") 
code(9)\Buffer = GetImageMem(9)
code(10)\string = "k" : LoadImage(10,"k.bmp") 
code(10)\Buffer = GetImageMem(10)
code(11)\string = "l" : LoadImage(11,"l.bmp") 
code(11)\Buffer = GetImageMem(11)
code(12)\string = "m" : LoadImage(12,"m.bmp") 
code(12)\Buffer = GetImageMem(12)
code(13)\string = "n" : LoadImage(13,"n.bmp") 
code(13)\Buffer = GetImageMem(13)
code(14)\string = "o" : LoadImage(14,"o.bmp") 
code(14)\Buffer = GetImageMem(14)
code(15)\string = "p" : LoadImage(15,"p.bmp") 
code(15)\Buffer = GetImageMem(15)
code(16)\string = "q" : LoadImage(16,"q.bmp") 
code(16)\Buffer = GetImageMem(16)
code(17)\string = "r" : LoadImage(17,"r.bmp") 
code(17)\Buffer = GetImageMem(17)
code(18)\string = "s" : LoadImage(18,"s.bmp") 
code(18)\Buffer = GetImageMem(18)
code(19)\string = "t" : LoadImage(19,"t.bmp") 
code(19)\Buffer = GetImageMem(19)
code(20)\string = "u" : LoadImage(20,"u.bmp") 
code(20)\Buffer = GetImageMem(20)
code(21)\string = "v" : LoadImage(21,"v.bmp") 
code(21)\Buffer = GetImageMem(21)
code(22)\string = "w" : LoadImage(22,"w.bmp") 
code(22)\Buffer = GetImageMem(22)
code(23)\string = "x" : LoadImage(23,"x.bmp") 
code(23)\Buffer = GetImageMem(23)
code(24)\string = "y" : LoadImage(24,"y.bmp") 
code(24)\Buffer = GetImageMem(24)
code(25)\string = "z" : LoadImage(25,"z.bmp") 
code(25)\Buffer = GetImageMem(25)
code123$ = GetString(LoadImage(#PB_Any,"pic.bmp"))
MessageRequester("TEST",code123$)
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo onny,

Kurze Fragen:
- Ist das zu lesende Bild immer in exakt dieser Grösse?
- Beginnt der Text immer bei Pixel X:21 Y:5?
- Sind die Buchstaben immer exakt 6 Pixel Breit und 10 Pixel hoch?
- Ist das zu lesende IMMER Weiss auf Schwarz?
- Enthalten deine Vorgaben (A.bmp etc.) alle verfügbaren Zeichen?

Wenn Du alles das mit JA beantworten kannst, dann könnte dein Ansatz Erfolg haben. Wenn nicht, dann musst Du dich mit OCR etwas mehr befassen.

Ich habe mal eine OCR in PB angefangen. Dazu sollte das Bild gescannt sein (zB Graustufen) und min 200 DPI haben. Mir ging es zuerst nur um das erkennen von Linien/Blöcken. Dann um das trennen von Zeichen und dann erst um das erkennen. Der aktuelle Stand liefert bis jetzt diese Ergebnisse (hab's mal als Bild zusammengefasst):
Bild
Ich habe aber noch Probleme beim lernen und späteren erkennen.

Ich habe auch schon darüber nachgedacht, ob ich meinen Source nicht freigeben soll damit andere Spezialisten hier im Forum evtl. bei der Erkennung über Neuronale Netze oder Pattern-Matching helfen können?

Grüsse,

Volker
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

ich kann bei allem mit ja antworten.... danke für deine antwort :allright:
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag von Slut-Hunter »

Ich weiss gar nicht, warum du dir so ein Stress machst, warum ein OCR Bruteforcer entwickeln für Images die bei jeder Seite anders sind ?

Das klappt nicht richtig, kannst mir glauben, ich Bruteforce seit ca 2 Jahren und hab so manches OCR Programm bevor es public wird, und hab eins gelernt, bei Strongbox Images geben alle Tools auf, und das sind noch nicht mal die Schlimmsten Images.

Wie man hier sieht.

http://sam.zoy.org/pwntcha/

Strongbox Image.

Bild


d.H geh einen anderen Weg, lade die Images runter, mach ne DB und trag von jedem Image, daß Wort und die Dateigröße ein, dann muss das Prog nur noch ableichen und die Trefferquote liegt bei 100%.

Aber dann hast immer noch das Problem, daß die Postdata stimmen muss, die action url, action referer url usw usw
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

Bild

Dieses Bild ist auch sehr einfach selber umzuwandeln, würde es gerne schaffen, llern man ja auch einiges an pb dabei ^^
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo Slut-Hunter,
Ich weiss gar nicht, warum du dir so ein Stress machst, warum ein OCR Bruteforcer entwickeln für Images die bei jeder Seite anders sind ?
Er hat auf meine Fragen mit JA geantwortet. Demnach sind seine zu lesenden Images immer exakt im selben Format (keine Distortion, keine Farbgebungen, keine Font-Wechsel etc.). Sein Zweck scheint nicht das zu sein, was Du vermutest.

@onny:
Wenn dem so ist, könnte dein einfacher Vergleich Funktionieren. Beachte dabei, dass die Daten im RAM zeilenweise liegen. Ein Bild mit 100 Pixel Breite ist dadurch nicht per einfachem Memory-Vergleich vergleichbar mit einem Bild von 10 Pixel Breite.

Code: Alles auswählen

Buchstabe       Vergleichsbild
AAAAAA          AAAAAAXXXXXX
BBBBBB          BBBBBBYYYYYY
CCCCC           CCCCCZZZZZZ

Ist im RAM (sehr vereinfacht)

AAAAAABBBBBBCCCCCC
AAAAAAXXXXXXBBBBBBYYYYYYCCCCCZZZZZZ
Somit kann man nicht vergleichen sondern sollte Pixelweise arbeiten. Mach es doch Pixelweise mit Malfunktionen und wandle es dann erst nach Funktionieren in einen Memory-Basierenden Vergleich um.

PS. Ich hab deinen Code nicht genau studiert. Keine Ahnung wie Du es im Moment machst.

Grüsse,

Volker
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag von Slut-Hunter »

Das ist auf jeden Fall per echter Erkennung zu machen, ist ein sehr schwacher ocr Code.
Nur großbuchstaben, immer die selbe Stellenanzahl und dazu auch noch schwarzweiss.

Also falls du unbedingt selber ein Prog für schreiben willst, kann ich dir da nicht helfen, da ich noch ein vollnoob im proggen bin, falls du das aber einem Prog das damit umgehen kann überlassen willst, dann schreib mir ne pm.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

hi, bei meinem beispiel werden vorgefertigte bilder mit dem hauptbild verglichen, auch hier pixel für pixel. jedem vorgefertigtem bild wird ein buchstabe zugewiesen, und das bild mit der höchsten anzahl von pixel die gleich sind wird ausgegeben.... Bloss komm ich mit dem Code nicht soooo ganz zurecht, ist ein wenig zu schwer für mich :? ich hoffe man kann mir weiterhelfen...

//edit
hier mal ein paar beispiele:
Bild
Bild
Bild
alle bilder gibts auch oben in einem archiv
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hi onny,

Mein Ansatz wäre dann folgender:

Ich denke, Du solltest eine Schleife machen die alle Buchstaben (immer 6x10 Pixel) aus dem Code der Reihe nach ausschneidet und als einzelnes Bild hält (GrabImage()-Befehl). Dieses Bild dann jeweils in einer Vergleichs-Procedure testen.

Diese kleine Procedure soll ein übergebenes Image mit den vorhandenen Vergleichsimages vergleichen (LoadImage()-Befehl). Der Vergleich könnte ganz einfach (erstmal) Pixelweise geschehen (Point()-Befehl).

Das wäre sicher nicht all zu schwer.

Grüsse,

Volker
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Genau das tut das Programm oben doch .
Antworten