溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用python-opencv怎么實(shí)現(xiàn)一個(gè)數(shù)字驗(yàn)證碼功能

發(fā)布時(shí)間:2020-12-22 13:53:22 來源:億速云 閱讀:398 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)利用python-opencv怎么實(shí)現(xiàn)一個(gè)數(shù)字驗(yàn)證碼功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1.明確要使用的包

首先就是opencv的函數(shù)庫,還有python自帶的random和PIL(Image、ImageDraw、ImageFont),一般pthon3以上的版本都是內(nèi)置安裝的,如果沒有安裝可以通過pip install的方法安裝具體操作如圖:

利用python-opencv怎么實(shí)現(xiàn)一個(gè)數(shù)字驗(yàn)證碼功能

輸入完按回車鍵即可安裝,因?yàn)槲乙呀?jīng)安裝了,就不輸入回車鍵了,安裝完了之后可以通過import的方式檢驗(yàn)是否安裝成功。記住先輸入python進(jìn)入python的編程環(huán)境在輸入import PIL,否則就會(huì)報(bào)錯(cuò)

利用python-opencv怎么實(shí)現(xiàn)一個(gè)數(shù)字驗(yàn)證碼功能

2.引入庫

代碼如下(示例):

import cv2 as cv
import random
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

3.生成隨機(jī)的顏色組合get_random_color()

彩色圖像是由RGB三色通道構(gòu)成的,但是要注意在opencv里面的彩色圖像是按照BGR的順序來構(gòu)成彩色圖像的,與其他的地方采用圖像的順序不一樣(例如halcon就是安裝RGB的順序來引用彩色圖像),
采用函數(shù)的形式來形成一個(gè)三個(gè)數(shù)組,當(dāng)函數(shù)返回的數(shù)值超過三個(gè)的時(shí)候,就會(huì)以數(shù)組的形式返回。
代碼如下(示例):

# 隨機(jī)生成不同顏色的組合
def get_random_color():
  B = random.randint(0, 255)
  G = random.randint(0, 255)
  R = random.randint(0, 255)
  # 防止生成白色噪聲噪線
  # 使用三個(gè)if條件判斷防止三個(gè)通道的顏色都是255(雖然是不可能事件)
  if B == 255:
    B = 0
  elif G == 255:
    G = 0
  elif R == 255:
    R = 0
  return(B, G, R)

如果你不放心是否返回了一個(gè)數(shù)組,可以進(jìn)行驗(yàn)證

#用于測試是否獲得了數(shù)組
a = get_random_color()
print(a)

4.生成顏色隨機(jī),數(shù)值隨機(jī)的數(shù)字生成函數(shù)get_random_number()

這個(gè)函數(shù)比較簡單,原理也是和上面隨機(jī)生成顏色組合一樣。
代碼如下(示例):

# 隨機(jī)生成數(shù)字
def get_random_number():
  random_num = str(random.randint(0, 9))
  return random_num

5.隨機(jī)生成一張干凈的(不帶噪聲噪線)數(shù)字驗(yàn)證碼圖像

使用PIL的Image、ImageDraw、ImageFont分別用于生成白色圖像背景、定義畫筆用于往圖像寫入數(shù)字、定義文字的字形和字體大小。
代碼如下(示例):

def generate_image():
  # 生成白色圖像,'RGB'類型,寬高為(150,50),底色為白色(255,255,255)
  image = Image.new('RGB', (150, 50), (255,255,255))
  # 定義畫筆,將圖像與畫筆關(guān)聯(lián)
  draw = ImageDraw.Draw(image)
  # 定義文字字形以及字體大小
  font = ImageFont.truetype("arial.ttf", size=36)

  name = "" # 定義一個(gè)空的字符串,用于不斷疊加數(shù)字,給圖像命名
  for i in range(5):
    random_number = get_random_number()
    # 不斷疊加隨機(jī)生成的數(shù)字,用于給圖像命名
    name += random_number

    # 在圖片上寫上數(shù)字,參數(shù)是:定位、數(shù)字(字符串)、顏色、字型
    draw.text((10+i*30, 0), random_number, get_random_color(), font=font)
  # 將圖像保存到指定的文件夾,下面使用xxxx的形式代表文件夾
  image.save('G:\xxxxxx\xxxxxxxx\%s.png' % name)

字體可以根據(jù)自己電腦已有的字體來選擇,具體路徑是C:\Windows\Fonts,

 font = ImageFont.truetype("arial.ttf", size=36)

6.往圖像添加噪聲噪線

函數(shù)的這一步不使用新的函數(shù),繼續(xù)接著上一個(gè)函數(shù)( generate_image())輸入代碼,為什么不使用?因?yàn)樵谧x取圖像的時(shí)候我們會(huì)用到name這個(gè)函數(shù),如果使用新的函數(shù)的話,就無法使用這個(gè)變量。當(dāng)然也可以通過類的方法,實(shí)現(xiàn)兩個(gè)函數(shù)之間的變量可以相互調(diào)用,這個(gè)就稍微麻煩點(diǎn),這里就不過多講述了。
代碼如下(示例):
(再次提醒下面代碼是接著generate_image()的,所以下面代碼都有一個(gè)縮進(jìn))

width = 150
  height = 50
  # 讀取文件夾的圖像,通過name來讀取指定的圖像,
  img = cv.imread('G:\xxxxxx\xxxxxxxxxxxx\%s.png' %name)
  # 繪制噪點(diǎn)
  for i in range(5):
    x = random.randint(0, width)
    y = random.randint(0, height)
    # 繪制實(shí)心圓,必須輸入?yún)?shù)分別是:圖像、圓心的位置、半徑、顏色,
    #最后一個(gè)是thickness默認(rèn)是None,繪制空心圓,指定為-1繪制實(shí)心圓
    cv.circle(img, (x,y), 1, get_random_color(), -1)

  # 繪制噪線
  for i in range(3):
    x1 = random.randint(0, width)
    y1 = random.randint(0, height)
    x2 = random.randint(0, width)
    y2 = random.randint(0, height)
    # 繪制線條,參數(shù)分別是:圖像、左上角的坐標(biāo)、右下角的坐標(biāo)、顏色
    cv.line(img, (x1,y1), (x2,y2), get_random_color())
  # 保存圖像
  cv.imwrite(r'G:\xxxxx\xxxxxxx\%s.png'%name, img)

7.調(diào)用函數(shù)生成數(shù)字驗(yàn)證碼圖像

所有的函數(shù)都已經(jīng)寫完,直接調(diào)用圖像生成函數(shù)就行了。
使用for循環(huán),循環(huán)調(diào)用generate_image()即可實(shí)現(xiàn)批量生成圖像,想要多少張就循環(huán)多少次。

for i in range(30):
  generate_image()

以上就是利用python-opencv怎么實(shí)現(xiàn)一個(gè)數(shù)字驗(yàn)證碼功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI