2009-06-20 24 views
11

würde Ich mag ein Python-Skript schreiben, die eine 3D-CAPTCHA wie dieses erzeugen würde: teabag captchaErzeugen eines 3D-CAPTCHA [pic]

Welche Grafikbibliotheken kann ich verwenden?

Quelle: ocr-research.org.ua

+1

nur noch eine Frage: ist 3D Captcha schwieriger zu Ocr? – RMAAlmeida

+0

Viel viel schwieriger. Lesen Sie die 'Quelle' für weitere Informationen. –

+0

Oh nein, hat jemand es wirklich Teebeutel ?? –

Antwort

2

Ich bin mir nicht sicher, ob ich mit einer vollen 3D-Bibliothek stören würde für das, was Sie oben haben. Erzeugen Sie einfach eine Matrix von 3D - Punkten, generieren Sie den Text mit etwas wie PIL, scannen Sie darüber, welche Punkte auf dem Raster angehoben werden, wählen Sie einen zufälligen Kamerawinkel und projizieren Sie die Punkte in ein 2D - Bild und zeichnen Sie sie mit PIL endgültiges Bild.

Das gesagt ... Sie können möglicherweise VPython verwenden, wenn Sie nicht selbst die 3D-Mathematik machen wollen.

+0

Wie erzeuge ich "eine Matrix von 3D-Ponts"? –

+0

Das wäre nur eine Liste von Tupeln - jedes Tupel würde 3 Zahlen haben - die für x, y und z stehen. –

+1

RobertW: Ohne irgendwelche Vorkenntnisse in 3D-Grafik zu haben, bedarf es ziemlich viel Readnigs, bevor Sie das ausprobieren können, denke ich. – Joey

1

Verwenden Sie Python-Bindungen für OpenGL, http://pyopengl.sourceforge.net/.

Erstellen Sie ein 2D-Bild von weißem Text über eine schwarze Fläche mit PIL. Machen Sie daraus ein 3D-Gitter, erhöhen Sie z von Punkt, wo Farbe weiß ist, vielleicht setzen Sie z = Farbwert, so durch das Unschärfe des Bildes können Sie echte Kurven in der z-Richtung bekommen.

Erstellen Sie ein OpenGL-Dreieck aus diesen Punkten, verwenden Sie den Drahtmodellmodus beim Rendern.

Greifen Sie den OpenGL-Puffer in ein Bild, z. B. http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html.

+0

würde ich gerne selbst tun, bei ausreichender Motivation;) –

4

Eine weitere Bindung, die beim Rendern mit opengl zu berücksichtigen ist, ist . Seine beste Eigenschaft ist, dass es nur ein Download ist. Ich denke, es enthält alles, was Sie brauchen, um zu implementieren, was Anurag ausspricht.

Ich werde Sie warnen, dass das, was Sie versuchen zu tun, nicht gerade ein einfaches erstes Projekt in 3D-Grafik ist. Wenn dies Ihr erster Kontakt mit OpenGL ist, sollten Sie eine Reihe von Tutorials wie NeHe Tutorials und andere Hilfe von OpenGL website in Betracht ziehen.

33

Es gibt viele Ansätze. Ich würde persönlich das Bild in Python Imaging Library mit ImageDraw 's draw.text erstellen, umwandeln in ein NumPy Array (usint NumPy asarray) dann Rendern mit Matplotlib. (Erfordert Matplotlib maintenance package).

Voll Code (in 2.5):

import numpy, pylab 
from PIL import Image, ImageDraw, ImageFont 
import matplotlib.axes3d as axes3d 

sz = (50,30) 

img = Image.new('L', sz, 255) 
drw = ImageDraw.Draw(img) 
font = ImageFont.truetype("arial.ttf", 20) 

drw.text((5,3), 'text', font=font) 
img.save('c:/test.png') 

X , Y = numpy.meshgrid(range(sz[0]),range(sz[1])) 
Z = 1-numpy.asarray(img)/255 

fig = pylab.figure() 
ax = axes3d.Axes3D(fig) 
ax.plot_wireframe(X, -Y, Z, rstride=1, cstride=1) 
ax.set_zlim((0,50)) 
fig.savefig('c:/test2.png') 

alt text

Offensichtlich gibt es ein wenig Arbeit zu tun, Achsen eliminiert, Ändern Betrachtungswinkel, etc ..

+0

+1 für Beispielcode, das sieht aus wie ein wirklich netter Start. – Kiv

+3

+1 Flipping genial. Du hast den Nagel auf den Kopf getroffen! –

+0

Sehr, sehr nett. Genau das, was ich wollte. Danke vielmals! (Ich wurde ausgeloggt, daher kann ich nicht für die Antwort stimmen :(). – quilby