python利用captcha生成驗證碼

import sys
import os
import shutil
import random
import time
from captcha.image import ImageCaptcha
 
#用於生成驗證碼的字符集
CHAR_SET = ['0','1','2','3','4','5','6','7','8','9']
#字符集的長度
CHAR_SET_LEN = 10
#驗證碼的長度,每個驗證碼由4個數字組成
CAPTCHA_LEN = 4
 
#驗證碼圖片的存放路徑
CAPTCHA_IMAGE_PATH = 'images/'
#用於模型測試的驗證碼圖片的存放路徑,它裏面的驗證碼圖片作爲測試集
TEST_IMAGE_PATH = 'test/'
#用於模型測試的驗證碼圖片的個數,從生成的驗證碼圖片中取出來放入測試集中
TEST_IMAGE_NUMBER = 100
 
#生成驗證碼圖片,4位的十進制數字可以有10000種驗證碼
def generate_captcha_image(charSet = CHAR_SET, charSetLen=CHAR_SET_LEN, captchaImgPath=CAPTCHA_IMAGE_PATH):   
    k  = 0
    total = 1
    for i in range(CAPTCHA_LEN):
        total *= charSetLen
        
    for i in range(charSetLen):
        for j in range(charSetLen):
            for m in range(charSetLen):
                for n in range(charSetLen):
                    captcha_text = charSet[i] + charSet[j] + charSet[m] + charSet[n]
                    image = ImageCaptcha()
                    image.write(captcha_text, captchaImgPath + captcha_text + '.png')//圖片格式改成其他可能會有問題
                    k += 1
                    sys.stdout.write("\rCreating %d/%d" % (k, total))
                    sys.stdout.flush()
                    
#從驗證碼的圖片集中取出一部分作爲測試集,這些圖片不參加訓練,只用於模型的測試                    
def prepare_test_set():
    fileNameList = []    
    for filePath in os.listdir(CAPTCHA_IMAGE_PATH):
        captcha_name = filePath.split('/')[-1]
        fileNameList.append(captcha_name)
    random.seed(time.time())
    random.shuffle(fileNameList) 
    for i in range(TEST_IMAGE_NUMBER):
        name = fileNameList[i]
        shutil.move(CAPTCHA_IMAGE_PATH + name, TEST_IMAGE_PATH + name)
                        
if __name__ == '__main__':
    generate_captcha_image(CHAR_SET, CHAR_SET_LEN, CAPTCHA_IMAGE_PATH)
    prepare_test_set()
    sys.stdout.write("\nFinished")
    sys.stdout.flush()  

這是爲下一步通過CNN對驗證碼進行識別做準備,當然captcha也可以生成字母數字同時存在的以及設置字體什麼的,功能還是很全的。

數字生成的結果如下圖:

該函數庫可以生成任意形式的數字字符類驗證碼,只要在創建對象時:

captcha = ImageCaptcha(fonts=['/path/to/A.ttf', '/path/to/B.ttf'])即可修改字體,利用該類中write函數,可以將任意長度數量的字符改爲驗證碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章