• 27.04.2024, 17:04
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

python schrifterkennung, c++ "crack" ges

Sonntag, 16. November 2008, 23:51

so, erstmal hier mein programm um das es geht, ich habs denke ich ausreichend kommentiert, wenns fragen gibt fragen: http://rafb.net/p/6Nrbj473.html
hier die data datei dazu: http://rafb.net/p/IIyzVg34.html

das programm dient dazu die standard windows schriftart (tahoma oder so ähnlich) zu erkennen die in allen windows "edit bereichen" bereichen benutzt wird, also z.b. einfach die adressleiste im explorer, oder wie bei meinem einsatzzweck: eine listbox
"k" kann es nicht, weil nach dem k keine leerzeile kommt, is für meinen einsatzzweck allerdings egal. (nur falls es jemand anderes für irgendwas mal benutzen will und sich wundert ;D)
ich übergebe einfach den bereich aus dem es den text erkennen soll, und ne ausgabe datei. dann macht das programm nen screen, schneidet den bereich aus, erkennt den text und schreibt ihn in die datei

funktioniert soweit auch. das problem: ich rufe das programm mehrere hundert mal direkt hintereinander auf, und das is "etwas" lahm (atm schafft das ca 3 einträge pro sekunde), weil logischerweise immer wieder python gestartet werden muss.

-> kennt sich hier jemand gut mit c/c++ aus und kann mir das darin schreiben? wenn sich jemand auskennt sollte das schnell geschafft sein ;D
wenn ich mich da nu durch wurschtel dauert das wieder viele stunden :-[


ps: nein, ich kann die listbox nicht einfach auslesen ;)
da gibts irgend ne technik wie die prorgammierer das verhindern können und auch machen

Re: python schrifterkennung, c++ "crack"

Montag, 17. November 2008, 13:26

Kannst du das Programm nicht einfach in einer Schleife laufen lassen, anstatt es immer neu zu starten?

Vielleicht bringt in deinem Fall Psyco was - allemal, wenn du den erneuten Programmstart umgehen kannst.

Zu deinem Python-Code:

- Benutze `xrange` anstelle von `range`.

- Dort, wo du oft `list.append()` benutzt, setze stattdessen `yield` ein, um die Funktion zu einem Generator zu machen.

- Strings sind atomar, *niemals* mit `+=` an Strings anhängen! Stattdessen eine Liste verwenden, weitere Zeichen anhängen (oder `yield` nutzen, s. o.) und am Ende `''.join(chars)` benutzen. Ansonsten Verschwendung bis Meppen!

- `file.readlines()` verwendet man nicht mehr, sondern iteriert direkt über das `file`-Objekt (`for line in f:`).

Weiterer Speedup lässt sich *möglicherweise* durch Verwendung des mitgelieferten `array`-Moduls oder das externe NumPy erreichen, wenn du viel in verschachtelten Listen rummachst, da zumindest für letzteres auch so manche für Mathematiker gängige Berechnungsfunktion sehr schnell implementiert sind.

Re: python schrifterkennung, c++ "crack"

Montag, 17. November 2008, 22:08

hm, ich habs gerade nochmal genau gemessen:
gesamtzeit pro aufruf: 300ms
zeit davon im python code: 45ms

also 250ms gehen dafür drauf das python gestartet wird. bis auf das yield (da versteh ich noch net so ganz wie das geht) hab ich mal alle vorschläge von dir eingebaut, aber nen unterschied is natürlich net wirklich da, und psyco bringt atm auch nicht merkbar was.

ich ruf das jedes mal neu auf, weil ich mit autoit die gui auslese, und somit die koordinaten erhalte wo der text steht.
aber in ner schleife laufen lassen müsste eigentlich gehen, ich hoffe mal ich kann an nen verstecktes fenster tastendrücke senden, dann kann ich so ja immer die neuen koordinaten übermitteln

Re: python schrifterkennung, c++ "crack"

Dienstag, 18. November 2008, 11:18

Ich kenne AutoIt nicht, aber wenn du allgemein nur einen Screenshot haben willst (bei dem du dann ab einem an deine Fensterdekoration angepassten Offset arbeitest), geht das IIRC auch mit der PIL aus Python heraus. (Edit: Scheinst du ja mit `ImageGrab` schon zu machen.)

Ein `yield`-Beispiel hätte ich dir gerne anhand deines Codes gegeben, aber der scheint schon weg zu sein. Schau dir stattdessen dieses Snippet an.

Durch das `yield` wird eine Callable zum Generator, d. h. die Werte werden nicht am Stück, etwa als Liste, komplett zurück gegeben, sondern nach und nach beim Abruf des nächsten Schrittes. Die Callable pausiert dabei und wird nur (sofern möglich) komplett ausgeführt, wenn dafür hinreichend oft Daten von ihr abgefragt wurden (etwa mit `.next()` oder in einem `for`-Loop oder als `map()`-Argument). Dadurch verhält sich ein Programm gerade bei anspruchsvollen Aufgaben u. U. sehr viel speicherfreundlicher (vgl. Generator Expressions).

Möchte man die Daten letztlich doch in einer Liste (einem Tupel, deinem Dictionary ...) haben, ruft man entsprechend etwa `list(my_generator())` auf. Insbesondere bei der Erstellung eines Dictionaries fällt dann die nur temporär benötigte Liste weg, mit der man es instanziieren will. Beispiel:

Quellcode

1
2
3
4
5
6
7
def gen_pairs():
    yield 'Peter', 32
    yield 'Marie', 27
    yield 'Hans', 45

people = dict(gen_pairs())
# -> {'Hans': 45, 'Marie': 27, 'Peter': 32}


Der Code kann durch den Einsatz von `yield` nicht nur ressourcenfreundlicher, sondern auch einfacher werden, da man z. B. keine leere Liste zu Beginn einer Callable anlegen und dann deren Namen mit `.append()` an einer oder mehreren Stellen angeben muss, sondern eben nur `yield` mit dem Wert verwenden kann.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Y0Gi« (22. Januar 2013, 04:19)

Re: python schrifterkennung, c++ "crack"

Dienstag, 18. November 2008, 11:31

so, anderes pastebin....
also der code sieht atm so aus: http://de.pastebin.ca/1260216
(die data datei: http://de.pastebin.ca/1260217)

bis auf die tatsache das ich es unschön finde immer ne python konsole offen haben zu müssen funktioniert das nun aber schon ganz gut. pro durchlauf ca 50ms, nochmal ca 50ms verbrät autoit für irgendwelches zeug, aber insgesamt komme ich damit jetzt auf ca 9 einträge auslesen pro sekunde, damit bin ich eigentlich ganz zufrieden

das yield guck ich mir nachher nochmal genauer an

Re: python schrifterkennung, c++ "crack"

Dienstag, 18. November 2008, 11:56

seh ich hier eine ueberlappung zum pokerbot beitrag? ;D

Re: python schrifterkennung, c++ "crack"

Dienstag, 18. November 2008, 12:19

Zitat von »elbarto`«

bis auf die tatsache das ich es unschön finde immer ne python konsole offen haben zu müssen [...]

Unter Windows kannst du ein Script mit `pythonw.exe` ausführen (ist normalerweise mit der Dateiendung `.pyw` verknüpft), damit keine Konsole geöffnet wird, unter Linux und OS X hast du `&`, `screen` und wasnichalles.


Was deinen Code angeht: Ersetze in deiner `rateletters()` alle Aufrufe von `a.append(foo)` mit `yield foo`, entferne das `return` und rufe die Funktion mit `text = gettext(rateletters(...))` auf. So wird überhaupt keine Liste erstellt, sondern in `gettext()` über die Ausgaben von `rateletters()` direkt iteriert. Das klappt natürlich nur solange du keine Listeneigenschaften benötigst, also z. B. ein `if x in a:` machen möchtest.

Die `gettext()` kannst du analog mit `yield` umgestalten; das `''.join(iterable)` wendest du dann allerdings außerhalb der Funktion auf ihre Rückgabe (den Generator) an.

Re: python schrifterkennung, c++ "crack"

Dienstag, 18. November 2008, 20:29

Zitat von »messi«

seh ich hier eine ueberlappung zum pokerbot beitrag? ;D


schon möglich ;D

Zitat von »Y0Gi«


Unter Windows kannst du ein Script mit `pythonw.exe` ausführen (ist normalerweise mit der Dateiendung `.pyw` verknüpft), damit keine Konsole geöffnet wird, unter Linux und OS X hast du `&`, `screen` und wasnichalles.


die konsole brauch ich halt weil ich da die werte von autoit rein schreiben lasse. an versteckte fenster kann ich net so einfach tastendrücke senden lassen. und ne konsole kann glaube ich mit senmessage nichts anfangen. ich glaube dafür muss ich mir ne gui schreiben, und die dann verstecken, aber die kann dann die sendmessage nachrichten empfangen ;D