2009-06-20 4 views
11

나는이 하나 같이 3D CAPTCHA을 생성 할 파이썬 스크립트를 작성하려합니다 : teabag captcha생성하는 3D CAPTCHA [그림]

내가 어떤 그래픽 라이브러리를 사용할 수 있습니까?

출처 : ocr-research.org.ua

+1

있다 :이다 3 차원 captcha ocr에 열심히? – RMAAlmeida

+0

훨씬 더 세게. 자세한 정보는 '소스'를 읽어보십시오. –

+0

오, 아니, 누군가가 정말로 그것을 티백이라고 부릅니까 ?? –

답변

2

나는 당신이 위의 무엇을위한 풀 3D 라이브러리를 귀찮게 것입니다 확실하지 않다. 3D 점의 행렬을 생성하고, PIL과 같은 텍스트를 생성하고, 그 위에 스캔하여 그리드의 어느 점이 발생하는지 확인하고, 임의의 카메라 각도를 선택한 다음 점을 2D 이미지로 투영하고 PIL로 그릴 수 있습니다. 최종 이미지.

말하기를 ... 당신은 자신이 3D 수학을하고 싶지 않다면 VPython을 사용할 수 있습니다.

+0

"3D 글꼴 행렬을 어떻게 생성합니까?" –

+0

이것은 단지 튜플의 목록 일 것입니다 - 각 튜플은 x, y 및 z를 나타내는 3 개의 숫자를가집니다. –

+1

RobertW : 3D 그래픽에 대한 사전 지식이 없으면이 모든 것을 시도해 볼 수 있기 전에 readnig가 필요합니다. – Joey

1

OpenGL 용 Python 바인딩 인 http://pyopengl.sourceforge.net/을 사용하십시오.

PIL을 사용하여 검은 색 표면에 흰색 텍스트의 2D 이미지를 만듭니다. 여기에서 3D 그리드를 만들면 색이 흰색 인 점의 z를 늘릴 수 있습니다. 은 z = 색상 값으로 설정 될 수 있으므로 이미지를 흐리게 처리하면 z 방향에서 실제 커브를 얻을 수 있습니다.

이 지점에서 OpenGL 삼각형을 만들고 렌더링하는 동안 와이어 프레임 모드를 사용하십시오.

이미지로 OpenGL 버퍼를 가져옵니다 (예 : http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html).

+0

충분한 동기 부여가 주어지면이 작업을 직접하고 싶습니다.) –

4

OpenGL을 사용하여 렌더링 할 때 고려해야 할 또 다른 바인딩은 pyglet입니다. 가장 좋은 점은 하나의 다운로드에 불과하다는 것입니다. 나는 그것이 당신이 Anurag의 철자를 구현하는데 필요한 모든 것을 포함하고 있다고 생각합니다.

나는 당신이하려고하는 것이 정확히 3d 그래픽에서의 첫 번째 간단한 프로젝트는 아니라는 점에주의 할 것입니다. 이것이 OpenGL에 처음 노출 된 경우 NeHe Tutorials과 같은 일련의 자습서와 OpenGL website의 다른 도움말을 고려하십시오.

33

많은 접근법이 있습니다. 개인적으로 ImageDraw의 draw.text를 사용하여 파이썬 이미징 라이브러리에서 이미지를 만들고 NumPy 배열 (usint NumPy의 asarray)로 변환 한 다음 Matplotlib으로 렌더링합니다. (Matplotlib maintenance package 필요). (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

은 분명히 축을 제거 할 수있는 약간의 작업 변화 시야각, 등등 그냥 다른 질문

+0

+1 샘플 코드는 정말 멋진 시작처럼 보입니다. – Kiv

+3

+1 멋지게 뒤집기. 니가 끝냈어! –

+0

아주 좋네요. 정확히 내가 원했던 것. 고마워요! (로그 아웃되었으므로 답변에 투표 할 수 없습니다.) – quilby