生成3D验证码[pic]

12 投票
4 回答
3856 浏览
提问于 2025-04-15 12:23

我想写一个Python脚本,生成一个像这样的3D 验证码

teabag captcha

我可以使用哪些图形库呢?

来源:ocr-research.org.ua

4 个回答

2

我觉得你不需要为了上面提到的内容去使用一个完整的3D库。你可以先生成一个3D点的矩阵,然后用像PIL这样的工具生成文本,再扫描这个文本,找出网格上哪些点是突起的。接着,随机选择一个相机角度,把这些点投影到一个2D图像上,最后用PIL把它们画到最终的图像里。

不过,如果你不想自己处理3D数学运算的话,你可以试试VPython

4

另一个可以用来在OpenGL中渲染的工具是pyglet。它最棒的地方在于只需要下载一个文件就可以了。我觉得它包含了你实现Anurag所说内容所需的一切。

不过我要提醒你,你想做的事情并不是一个简单的3D图形入门项目。如果这是你第一次接触OpenGL,建议你先看看一些教程,比如NeHe教程,还有来自OpenGL官网的其他帮助。

33

有很多方法可以做到这一点。我个人会使用Python的图像处理库,叫做

ImageDraw

,通过它的draw.text功能来创建图像,然后把它转换成一个

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')

alt text

显然,这里还有一些工作要做,比如去掉坐标轴、改变视角等等。

撰写回答