Создание 3D CAPTCHA [pic]

Я хотел бы написать Python script, который будет генерировать 3D CAPTCHA, как этот: teabag captcha

Какие графические библиотеки я могу использовать?

Источник: ocr-research.org.ua

Ответ 1

Существует много подходов. Я лично создал бы изображение в Python Imaging Library, используя ImageDraw draw.text, конвертировать в NumPy array (usint NumPy asarray), затем выполните рендеринг с Matplotlib. (Требуется Matplotlib пакет обслуживания).

Полный код (в 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

Очевидно, что предстоит небольшая работа, устранение осей, изменение угла обзора и т.д.

Ответ 2

Другим обязательным условием для рендеринга с opengl является pyglet. Его лучшая особенность заключается в том, что это всего лишь одна загрузка. Я думаю, он содержит все, что вам нужно, чтобы реализовать то, что говорит Анураг.

Я предупреждаю вас, что то, что вы пытаетесь сделать, - это не совсем простой первый проект в 3d-графике. Если это ваша первая публикация OpenGL, рассмотрите серию обучающих программ, таких как NeHe Tutorials и другую помощь сайт OpenGL.

Ответ 3

Я не уверен, что буду разбираться в полной 3D-библиотеке за то, что у вас есть выше. Просто сгенерируйте матрицу трехмерных точек, сгенерируйте текст с чем-то вроде PIL, просмотрите его, чтобы найти, какие точки на сетке подняты, выберите случайный угол камеры, а затем проецируйте точки в 2D-изображение и нарисуйте их с PIL на окончательное изображение.

Как говорится... вы можете использовать VPython, если вы не хотите делать 3D-математику самостоятельно.

Ответ 4

Используйте привязки Python для OpenGL, http://pyopengl.sourceforge.net/.

Создайте 2D-изображение белого цвета на черной поверхности с помощью PIL. Сделайте из этого 3D-сетку, увеличьте z точки, где цвет белый, возможно, установить z = значение цвета, поэтому, размывая изображение, вы можете получить реальные кривые в направлении z.

Создайте треугольник OpenGL из этих точек, используйте режим wireframe во время рендеринга.

Возьмите буфер OpenGL в изображение, например, http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html.