利用 tesseract 解析簡(jiǎn)單數(shù)字驗(yàn)證碼圖片

tesseract 是一個(gè) OCR(Optical Character Recognition,光學(xué)字符識(shí)別)引擎榄融,能夠識(shí)別圖片中字符,利用這個(gè)可以用來(lái)解析一些簡(jiǎn)單的圖片驗(yàn)證碼
Github 地址:https://github.com/tesseract-ocr/tesseract

Windows 平臺(tái) v3.05.01 版本下載地址:http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.01.exe

一開(kāi)始弄這個(gè)是因?yàn)閷W(xué)校網(wǎng)絡(luò)要上網(wǎng)每次都要在網(wǎng)頁(yè)驗(yàn)證救湖,就想能不能寫(xiě)個(gè)程序自動(dòng)驗(yàn)證免去手動(dòng)驗(yàn)證過(guò)程愧杯。但這需要驗(yàn)證碼,為了解決這個(gè)問(wèn)題鞋既,就上網(wǎng)搜了一下力九,就看到有用 tesseract 的。

有人用 Python 實(shí)現(xiàn)了一個(gè)工具:https://github.com/madmaze/pytesseract

拿來(lái)試了一下邑闺,Windows 上使用總是有問(wèn)題
我就把目光轉(zhuǎn)向了 tesseract 本身跌前,這是它的使用說(shuō)明

C:\Program Files\Tesseract-OCR>tesseract
Usage:
  tesseract --help | --help-psm | --version
  tesseract --list-langs [--tessdata-dir PATH]
  tesseract --print-parameters [options...] [configfile...]
  tesseract imagename|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  -psm NUM              Specify page segmentation mode.
NOTE: These options must occur before any configfile.

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.

Single options:
  -h, --help            Show this help message.
  --help-psm            Show page segmentation modes.
  -v, --version         Show version information.
  --list-langs          List available languages for tesseract engine.
  --print-parameters    Print tesseract parameters to stdout.

最后就決定自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的接口

使用方法

ocr = Ocr(r'C:\Program Files\Tesseract-OCR')
# 本地圖片
result = ocr.exec(img_path=r"e:\python\pyocr\images\1.png")
# 網(wǎng)絡(luò)圖片
result = ocr.exec(img_url="http://oog4yfyu0.bkt.clouddn.com/2.jpg")
print(result)

對(duì)參數(shù)解釋一下

def __init__(self, ocr_path, out_path=None, mode=3, delete=True):
    """
    ocr_path:  
      tesseract 引擎的安裝路徑,例如我的 r'C:\Program Files\Tesseract-OCR'
    out_path:  
      輸出文件路徑陡舅,如果只是簡(jiǎn)單為了獲取解析出來(lái)的數(shù)字抵乓,可不管,默認(rèn)地址為 r"D:\result.txt"
    mode:
      圖片的切割模式靶衍,參見(jiàn) tesseract 使用方法灾炭,默認(rèn)為 3
    delete:
      是否保留生成的文本文件,默認(rèn)不保存
    """
def exec(self, *, img_path="", img_url=None):
    """ 執(zhí)行命令
    img_path:
      本地圖片路徑颅眶,如 r"e:\python\pyocr\images\1.png"
    img_url:
      網(wǎng)絡(luò)圖片地址蜈出,如 "http://oog4yfyu0.bkt.clouddn.com/2.jpg"
    """

具體思路

本地圖片的,先判斷該文件是否存在涛酗;網(wǎng)絡(luò)圖片的铡原,下載到本地,默認(rèn)的保存路徑是 r"D:\img.jpg" (保存在哪不重要商叹,只是暫存而已燕刻,解析完會(huì)自動(dòng)刪除的)

img = r"D:\img.jpg"
if os.path.exists(img_path):
      img = img_path
else:
    try:
        request.urlretrieve(img_url, img)
    except Exception as e:
        print(e)

接下來(lái)是一些非必要參數(shù)

# 默認(rèn)的文本文件存放路徑為 r"D:\result"(這個(gè)也不重要,程序結(jié)束也會(huì)自動(dòng)刪除)
if self._outpath is None:
    self._outpath = r"D:\result"

# tesseract 在執(zhí)行的時(shí)候剖笙,輸出文件路徑不需要帶 .txt 后綴酌儒,它自己會(huì)生成的。
elif self._outpath.endswith(".txt"):
    self._outpath = self._outpath[:-4]

# 這個(gè)是模式選擇枯途,如果模式非法設(shè)置為默認(rèn)的 3
if self._mode > 10 or self._mode < 0:
    self._mode = 3

接下來(lái)就是執(zhí)行命令

# 當(dāng)前目錄切換到引擎安裝路徑
os.chdir(self._ocrpath)  

# 拼裝命令
cmd = r'tesseract.exe {img} {out} -psm {mode}'.\
    format(img=img, out=self._outpath, mode=self._mode)

# 執(zhí)行命令
os.system(cmd)

# 讀取解析結(jié)果
try:
    with open(self._outpath + ".txt", "r") as f:
        result = f.read().strip()
        # 刪除臨時(shí)存儲(chǔ)文件
        if self._delete:
            os.remove(self._outpath + ".txt")
            os.remove(r"D:\img.jpg")
        # 將結(jié)果返回
        return result
except IOError:
    print("無(wú)法找到該文件!")
return None

至于為什么只是數(shù)字忌怎,是因?yàn)橛⑽牡目偸遣荒芡耆馕龀鰜?lái),修改了 -l 參數(shù)也是沒(méi)用酪夷,使用其自帶的 tessdata 也沒(méi)用榴啸,中文的話(huà)解析出來(lái)的內(nèi)容完全看不懂... (或許是我打開(kāi)方式不對(duì)?)

效果

測(cè)試圖片
C:\Users\54186\Anaconda3\python.exe E:/Python/pyocr/ocr.py
Tesseract Open Source OCR Engine v3.05.00dev with Leptonica
5108
測(cè)試圖片
C:\Users\54186\Anaconda3\python.exe E:/Python/pyocr/ocr.py
Tesseract Open Source OCR Engine v3.05.00dev with Leptonica
4893
測(cè)試圖片
C:\Users\54186\Anaconda3\python.exe E:/Python/pyocr/ocr.py
Tesseract Open Source OCR Engine v3.05.00dev with Leptonica
130768

溫馨提示:不能保證百分百正確晚岭,也不能保證百分百解析得出來(lái)鸥印。所以項(xiàng)目?jī)H供參考!!库说!要有保證的話(huà)還是找打碼平臺(tái)吧

具體代碼參見(jiàn) Github:https://github.com/chenjiandongx/pyocr

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狂鞋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潜的,更是在濱河造成了極大的恐慌骚揍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啰挪,死亡現(xiàn)場(chǎng)離奇詭異信不,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)亡呵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)抽活,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锰什,你說(shuō)我怎么就攤上這事下硕。” “怎么了汁胆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵梭姓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沦泌,道長(zhǎng)糊昙,這世上最難降的妖魔是什么辛掠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任谢谦,我火速辦了婚禮,結(jié)果婚禮上萝衩,老公的妹妹穿的比我還像新娘回挽。我一直安慰自己,他們只是感情好猩谊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布千劈。 她就那樣靜靜地躺著,像睡著了一般牌捷。 火紅的嫁衣襯著肌膚如雪墙牌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天暗甥,我揣著相機(jī)與錄音喜滨,去河邊找鬼。 笑死撤防,一個(gè)胖子當(dāng)著我的面吹牛虽风,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辜膝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼无牵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厂抖,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茎毁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后验游,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體充岛,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年耕蝉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崔梗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垒在,死狀恐怖蒜魄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情场躯,我是刑警寧澤谈为,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站踢关,受9級(jí)特大地震影響伞鲫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜签舞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一秕脓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒搭,春花似錦吠架、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至魂仍,卻和暖如春拐辽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擦酌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工俱诸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仑氛。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓乙埃,卻偏偏與公主長(zhǎng)得像闸英,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子介袜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,478評(píng)論 6 427
  • afinalAfinal是一個(gè)android的ioc甫何,orm框架 https://github.com/yangf...
    passiontim閱讀 15,429評(píng)論 2 45
  • 她是云國(guó)最不受寵的五公主,自幼便受盡欺辱遇伞。 他是華國(guó)的三皇子辙喂,自記事起便在云國(guó)為質(zhì)。 一場(chǎng)宮宴讓他們相遇鸠珠,而她看見(jiàn)...
    我在搜索著幸福閱讀 337評(píng)論 0 0
  • 嗨好久不見(jiàn) 之前后臺(tái)有個(gè)粉絲問(wèn)我巍耗,怎么都不跟新了,想想也是渐排,很久沒(méi)有跟新了炬太。最近一陣子都很忙,但是事實(shí)上也不知道自...
    感受197閱讀 160評(píng)論 0 0
  • 錦瑟綿長(zhǎng)驯耻,不負(fù)黎明——一個(gè)在學(xué)生會(huì)里成長(zhǎng)的故事 初識(shí)青媒亲族,是因?yàn)閷W(xué)姐的一句話(huà),“只要你喜歡寫(xiě)作”可缚。是的霎迫,我喜歡寫(xiě)作...
    愛(ài)讀書(shū)的喵123閱讀 1,670評(píng)論 7 2