2009-06-20 10 views
11

me gustaría escribir un script en Python, que generaría un 3D CAPTCHA como éste: teabag captchaGenerar un CAPTCHA de 3D [pic]

que las bibliotecas de gráficos puede usar?

Fuente: ocr-research.org.ua

+1

Sólo otra pregunta: ¿es Captcha 3D más difícil de usar? – RMAAlmeida

+0

Mucho más difícil. Lea la 'fuente' para más información. –

+0

Oh no, ¿alguien realmente lo llamó bolsita de té? –

Respuesta

2

no estoy seguro de que me moleste con una biblioteca completa en 3D para lo que tiene encima. Simplemente genere una matriz de puntos 3D, genere el texto con algo como PIL, escanee para encontrar qué puntos de la cuadrícula se elevan, elija un ángulo de cámara aleatorio y luego proyecte los puntos en una imagen 2D y dibuje con PIL al imagen final

Dicho esto ... usted puede usar VPython si no desea hacer las operaciones matemáticas en 3D usted mismo.

+0

¿Cómo puedo "generar una matriz de 3d ponts"? –

+0

Eso sería solo una lista de tuplas, cada tupla tendría 3 números, representando x, y y z. –

+1

RobertW: Sin ningún tipo de conocimiento previo de gráficos 3D, esto requiere un poco de lectura antes de poder probarlo, creo. – Joey

1

Utilice enlaces de Python para OpenGL, http://pyopengl.sourceforge.net/.

Crea una imagen 2D de texto en color blanco sobre una superficie negra usando PIL. Realice una cuadrícula 3D a partir de esto, aumente z del punto donde el color es blanco, puede establecer z = valor del color, por lo que al empañar la imagen puede obtener curvas reales en la dirección z.

Crea un triángulo OpenGL a partir de estos puntos, utiliza el modo de estructura alámbrica durante la reproducción.

Tome el búfer OpenGL en una imagen, por ejemplo, http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html.

+0

Me encantaría hacer esto por mí mismo, con suficiente motivación;) –

4

Otro enlace a considerar para la representación con opengl es pyglet. Su mejor característica es que es solo una descarga. Creo que contiene todo lo que necesitas para implementar lo que Anurag explica.

Te advierto que lo que estás tratando de hacer no es exactamente un primer proyecto simple en gráficos 3D. Si esta es su primera exposición a OpenGL, considere una serie de tutoriales como NeHe Tutorials y otra ayuda del OpenGL website.

33

Hay muchos enfoques. Yo personalmente crearía la imagen en la biblioteca de imágenes de Python usando draw.text de ImageDraw, la convertiría en una matriz NumPy (usint NumPy's asarray) y luego renderizaría con Matplotlib. (Requiere Matplotlib maintenance package).

código completo (en 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

Obviamente hay un poco de trabajo por hacer, eliminando ejes, el cambio de ángulo de visión, etc ..

+0

+1 por código de muestra, esto parece un buen comienzo. – Kiv

+3

+1 Voltear impresionante. ¡Lo lograste! –

+0

Muy, muy agradable. Exactamente lo que quería. ¡Muchas gracias! (Me desconecté, así que no puedo votar por la respuesta :(). – quilby