• Hey Leute :)


    Ich bastel seit 3 - 4 Tagen, in meiner Freizeit auf arbeit, an nem OCR.


    Das Script erkennt die Zeichen und matcht sie Punkt für Punkt gegen diverse Matrizen.
    Das Matching ist sehr simpel und prüft einfach nur relational den Punkt (x, y) und das Umfeld in der Matrix.
    Wenn eine Übereinstimmung auf einen der Punkte statt findet wird dieser mitgezählt.
    Die Matrix die am Ende die meisten Übereinstimmungen hat gewinnt das Rennen.
    Damit matche ich ca 60% - 70% korrekt.


    Jetzt zum Problem.
    Charaktäre wie I oder ein kleines L haben eine grade Matrix ohne leere Punkte.
    Somit matchen diese immer.
    Charaktäre die mehr Punkte zum Matchen haben sind natürlich auch ein Problem.
    Z.B. der Buchstabe C wird eher auf ein Q passen da es dort mehr zu matchen gibt.
    Natürlich berechne ich das prozentuale Verhältnis zu übereinstimmenden Punkten und maximal zu treffenden Punkten.
    Das reicht aber noch nicht.
    Ich überlege wie man am besten folgende Variablen einbeziehen kann.
    - Maximal zu erreichende Punktzahl in einer Matrix
    - Maximale Anzahl an überinstimmenden Punkten
    - Übereinstimmende Punkte
    - Erreichte Punktzahl in der Matrix
    - Anzahl der zu prüfenden Punkte


    Jetzt hab ich an euch ein paar fragen.


    1. Meint ihr ein Service auf Stagetwo, wo man ein Captcha hinsenden kann und die Lösung bekommt, würde etwas bringen?
    2. Würde euch ein Artikel über das Thema interessieren?
    3. Habt ihr noch eine Idee wie man das Matching unter einbezug der Variablen noch verbessern kann? (Möglicht in weniger als 3 if's^^)


    Danke im Vorraus für eure Meinung und Unterstützung.


    Gruß Sick^

  • 1. keine Meinung, da mich Captchas nicht stören ^^
    2. Definitv
    3. Aus dem Stehgreif nicht, werde da aber sicher im Zug oder so noch mal drüber nachdenken evt. komm ich dann mit Ideen wenn ich wieder zu Hause bin

  • Cooles Projekt was du dir da ausgedacht hast :)


    ehm, bei deinem I und kL Problem hab ich auch keine Idee, aber bei deinem Q und C:


    weiß ja nicht wie deine Matrix aussieht, aber bei einer Matrix die für ein C in etwa so aussieht:


    0 0 1 1 0
    0 1 0 0 0
    1 0 0 0 0
    0 1 0 0 0
    0 0 1 1 0


    Könntest du doch relativ gut ein C von einem Q unterscheiden, oder?


    Da du die Zeichen ja eh schon erkennst, könntest du diese doch runterskalieren, so dass ein Buchstabe ziemlich genau auf eine Matrix passt.

  • Ja aber das Q Matcht genause da es die selbe rundung hat.
    Das gleiche gilt für O und das kleine c und o und 0.
    Die Buchstaben die sich so ähneln sind halt schwer zu matchen da z.b. das C auf alles rauf passt.
    Z.b. das kleine c und das große C ist eigendlich identisch da man ja x und y auf die matrix anpasst.


    Ja der würde dann kostenfrei sein.
    Ich würde dann um den algo lernen zu lassen sagen das man für n selber gelöste captchas x punkte auf stagetwo bekommt.


    edit: lalalol nice das du die seite "gestarrt" hast^^

  • Hehe da hast du natürlich recht, soweit hat damals wohl keiner gedacht :D


    Hm, wenn du das Zeichen hast und sagst Pixel a mit Pixel b aus der Matrix abgleichen (1 = Schwarz, 0 = Weiß), dann sagst du diese Matrix hat z.B. 7 Schwarze Pixel, davon trifft das C genau 7, die Q Matrix hat dann meinetwegen 15 Pixel, wovon du dann aber nur 7 Treffen würdest. => C Matrix = 100%; Q Matrix = 46%


    Ich hab wenig bis keine Ahnung von dem Algorithmus, aber irgendwie so müsste das doch lösbar sein?
    ____________


    Edit:


    bei anderen Buchstaben dasselbe. Wenn es dir gelingt alle Buchstaben auf die selbe größe zu skalieren, dann kannst du ein kleines C doch so darstellen:


    0 0 0 0 0
    0 0 0 0 0
    0 1 1 0 0
    1 0 0 0 0
    0 1 1 0 0


    Zumindest macht das so in meinem Kopf gerade Sinn :D das muss nix heißen :P

  • Ja ich hab auch schon nachgedacht so in der art.
    Zudem habe ich auch alpha mit drinne.
    Meine Matrix geht von 0 - 9 wobei 0 dem nichts entspricht.


    $matchedPoints / $maxMatchedPoints * 100 = $matchingPointsPercentage
    $totalMatch / $maxReachablePoints * 100 = $totalMatchingPercentage


    Das erste gilt halt für die Anzahl der Matchings unabhängig vom Wert in der Matrix (1-9) und das 2te ist halt das exakte Matching.
    Wenn man beide Addiert hat man schon etwas mehr genauigkeit aber das reicht nicht.


    Edit: Das Problem dadran ist das $matched Points $maxMatchedPoints überschreiten kann und wird.
    Sobald ein Charakter größer als die Matrix ist wird runter skaliert und der eine oder andere Punkt wird mehrmals übereinstimmen.
    Somit hätten wir eine Prozenzahl über 100 und es würde größere Charaktäre bevorzugen.
    Sprich je größer der Charakter desto ungenauer das Matching.

  • Ist es nicht egal wie oft ein Punkt in der Matrix getroffen wird, wichtiger ist es doch, dass er getroffen wird, demensprechend kannst du doch für jeden einzigartigen Treffer $matchedPoints inkementieren und damit liegt das Maximum wieder bei 100%.

  • Ich hab da mal eine weiter (anforderungs-)Frage
    Wie reagiert der code auf verdrehungen und verzerrungen?
    so wie ich das einschätze, kennt sich dein Code bald nicht mehr aus.


    Vielleicht kannst du ja deinen Ansatz verändern und ein Paar anzätze aus der Bilderkennung verwenden, SIFT, oder SIFT oder MOPS

  • Naja, dass es kein extrem guter OCR wird ist doch alleine dadurch schon klar, dass die ganzen Proiprojekte auf 2-3 Bibliotheken zurückgreifen und über Jahre und Jahrzehnte entwickelt wurden um so gut zu sein wie sie sind und selbst da hat man noch eine gewisse Fehlerrate.

  • als subtiler ansatz würde ich das raster feiner gliedern und dann mittels drehmatritzen die drehung und durch zerr- und streckmatritzen die verzerrungen testen. wenn eine gedrehte oder verzerrte matrix besser matcht, nimmste die.

    Dieser Beitrag wurde noch nie editiert, zuletzt von »hangman« (Heute , 13:37)



    1355?mode=raw


    Skill ist, wenn Luck zur Gewohnheit wird