12

我想编写一个 Python 脚本来生成像这样 的 3D CAPTCHA :茶包验证码

我可以使用哪些图形库?

资料来源:ocr-research.org.ua

4

4 回答 4

33

有很多方法。我会亲自使用ImageDraw的 draw.text 在 Python Imaging Library 中创建图像,转换为NumPy数组(使用 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')

替代文字

显然还有一些工作要做,消除轴,改变视角等等。

于 2009-06-20T19:04:57.247 回答
4

使用 opengl 进行渲染时要考虑的另一个绑定是pyglet。它的最大特点是只需一次下载。我认为它包含了实现 Anurag 所阐述的一切所需的一切。

我会提醒你,你要做的并不是一个简单的第一个 3d 图形项目。如果这是您第一次接触 OpenGL,请考虑一系列教程,例如NeHe 教程OpenGL 网站提供的其他帮助。

于 2009-06-20T15:59:12.557 回答
2

我不确定我是否会为您上面所拥有的完整的 3D 库而烦恼。只需生成一个 3D 点矩阵,用 PIL 之类的东西生成文本,扫描它以找出网格上的哪些点被抬起,选择一个随机的摄像机角度,然后将这些点投影到 2D 图像中,然后用 PIL 将它们绘制到最终图像。

话虽这么说……如果您不想自己进行 3D 数学运算,则可以使用VPython 。

于 2009-06-20T14:43:12.170 回答
1

为 OpenGL 使用 Python 绑定,http ://pyopengl.sourceforge.net/ 。

使用PIL在黑色表面上创建白色文本的 2D 图像。从中制作一个 3D 网格,增加颜色为白色的点的 z,也许设置 z=color 值,因此通过模糊图像,您可以获得 z 方向的真实曲线。

从这些点创建一个 OpenGL 三角形,在渲染时使用线框模式。

将 OpenGL 缓冲区抓取到图像中,例如 http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html

于 2009-06-20T14:51:05.337 回答