OCR - Brainstorming

  • Hallo, ich habe jetzt nach langer Zeit endlich den Entschluss gefasst eine simple Version eines OCR-Readers zu basteln. Jener soll lediglich ein bestimmtes Format erkennen (Schriftart und -größe sind konstant genau wie die Farbe, die Hintergrundfarbe wechselt jedoch).
    Zwischen den Buchstabel existiert jeweils eine 1 pixel breite Lücke. Buchstaben sind schwarz

    Als ich mich jetzt daran machen wollte, erste Ideen zusammenzustellen und zu coden stand ich vor folgenden Problemen:
    Ich beginne also damit die Buchstaben voneinander zu separieren (ich suche die 1 pixel breite lücken). Schon hier befürchte ich dass dies unnötige Zeit frisst (da ich jede y-reihe für jeden x-punkt überprüfen muss). Dennoch wird mir nichts anderes übrig bleiben(?).

    Welche Methode soll ich benutzen, um die Buchstaben abzugleichen?
    Pixelchecksum funktioniert nicht, weil es nicht den Unterschied zwischen 6 und 9, a nud e usw. erkennt. Also überlegte ich, ob ich die Coords der schwarzen Pixel in einem Array speichern soll um dann den Arrayinhalt abzugleichen. Ich befürchte, das dauert recht lange.
    Ich könnte alternativ jeden Buchstaben vorspeichern (mit den 4 möglichen Hintergrundfarben) und damit einen Abgleich machen (vorrausgesetzt man kann Bilder Pixelwise abgleichen(?) )
    Also welche Methoden habt ihr schon verwendet und gute Erfahrungen gemacht? Ich baue in diesem Punkt auf Schnelligkeit gleichermaßen wie auf Genauigkeit!

    Sollte ich direkt auf dem Screen arbeiten, oder empfiehlt sich ein Screenshot den ich dann überprüfe? Was ist schneller? (Ich tendiere, bei gleichem Zeitaufwand, zu dem screenshot, da der text in den Zeilen verrutscht wenn weiterer Text hinzugefügt wird)

    Ich bin bereits gut in AutoIT eingearbeitet, aber mir fehlt das Hintegrrundwissen, welche Methoden schnell und sauber arbeiten und welche veraltet oder einfach nur langsam sind. Habe bisher auch wenig mit Graphiken überhaupt gearbeitet (weiter als bis zum erstelen von screenshots kam ich nicht :P)
    Würde mich freuen von etwas erfahreneren Leuten Feedback zu bekommen.
    Vielleicht gibt es ja eine Graphik-Klasse die ich übersehen habe mit der vieles einfacher wird oder oder oder...

    Selbstverständlich werde ich am Ende meine Lösung (zumindest teilweise) darlegen.

    Mit besten Grüßen
    zombie36

  • es handelt sich nicht um captchas sondern um einen chatroom der mit controlgettext nur nen leeren string ausspuckt. Für diesen möchte ich ein Protokoll mitlaufen lassen. Mit o.g. Ansatz würde ich ohnehin keine Captchas knacken können, da einzelne Pixel ja immer überdeckt werden, die Buchstaben in anderen Winkeln liegen und vieles mehr.

  • Ich wünsche dir viel Spaß mit tesseract.
    Edit: Wenn du es selbst schreiben willst, dann hast du schon den richtigen Ansatz. Bildschirmfoto und dann jeden Pixel ablaufen. Du musst die Pixel nicht unbedingt nachbarweise prüfen, du kannst auch springen und damit schneller Muster erkennen.

    Einmal editiert, zuletzt von progandy (17. August 2011 um 21:32)

  • vielen dank für dein edit. Ich bin ja daran interessiert komplizierte dinge zu lösen :) außerdem ist tesseract nur c++ kompatibel soweit ich weiß. Das mit den Mustern ist ne gute Idee (ist halt viel Aufwand im Vorhinein bis man die speziellen muster rausgefiltert hat ^^) !!
    Werd mich später gleich dransetzen, wenn jemand was hinzuzufügen hat,immer her damit :)

    Lieben gruß

  • Also, ich hab mir tesseract mal angesehen und
    bekam folgenden output:

    new newe ww :we
    new vyenvsnu ewx
    me :wnek
    m 2345smaeneeergw\k\~~ene»ewW»y1Ascnsrsmmmwnwuasmv
    ww/z sn
    new me cwnek, www nw van me H eeeenee Ae w

    Das dazu :)

    Außerdem habe ich mir die einzelnen Buchstaben angesehen, pixelweise ausgewertet und einfach drauf losgecoded. Indem ich die einzenen Buchstaben voneinander trenne und mir die jeweiligen Pixel danach ansehe komme ich zu dem gewünschten ergebnis. Dies dauert aber recht "lange" (max 5 zeilen/s)

    lieben Gruß

    Einmal editiert, zuletzt von zombie36 (21. August 2011 um 00:40)

  • danke für den hinweis, aber tatsächlich soll es nur ein protokoll erstellen. Ich verwende die daten im nachhinein zur auswertung mit einem datenbanksystem. Das ist nur ein teil eines sehr großen projekts dass ich aus reiner freude am lernen in angriff nehme :)

  • 1.) Was besagt das rauseditieren denn aus außer
    2.) dass der screenshot unnötigerweise dort stand, weil das resultat meiner aussage mit oder ohne das gleiche bleibt.

    unabhängig davon verstehe ich nicht ob ich mich hier rechtfertigen soll oder nicht. Ich habe erklärt wozu ich die chatbox auslesen möchte.
    Wenn ihr unlautere Absichten vermutet dann unterlasst die Hilfe und schließt den Thread und einen Schlussstrich unter das Thema.
    Ich weiß aber dass viele irgendwann vor dem Problem stehen, Text nicht auslesen zu können. Mein einziges Anliegen ist herauszufinden, wie man ein Workaround bildet das flüssig und schnell läuft.

  • Zitat

    Wenn ihr unlautere Absichten vermutet dann unterlasst die Hilfe und schließt den Thread


    Genau das möchte ich erreichen.

    Der Screenshot war von einem Chat eines Onlinespiels (Poker?), in ihm waren Statusmeldungen zu sehen wie "Dealer deckt Turn auf: Herz 10" (oder so ähnlich)

    Bots unterstützen wir hier nicht, egal ob das Thema OCR möglicherweise jemanden interessieren könnte.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.