用node.js實現驗證碼簡單識別
來自: http://think2011.net/2016/01/31/node-ocr/
概述
在驗證碼識別上, node.js 其實也只是打醬油的角色,因為已經有成熟的工具做這個事情,而 node 只需要做調度就行了。
所需工具
那么介紹一下這些工具吧
- Tesseract 開源的 OCR 識別工具,目前由 Google 維護,支持中文,默認的識別率很低哈,特別是中文,但是可以自己提供樣本,訓練提高識別率。
- graphicsmagick 非常實用的圖像處理工具,下面會講到用途。
Tesseract的使用
以下操作均在 Mac 環境下,Windows 其實也差不多,請自行區分 :-)。
安裝
brew install tesseract --all-languages
使用
tesseract 1.jpg -psm 7 r
-psm 7 表示識別的內容是文本, r 是保存識別內容的文件。
然后你會發現識別結果很坑.. (⊙o⊙)..

提高識別率
之所以是這樣,是因為驗證碼上有無關的圖像干擾,例如噪點什么的,理論上去掉了干擾的元素,識別率就會極大的提高。
用閾值處理圖片是個很方便的辦法,在 Photoshop中可以模擬這種操作 。

再試一次
這里配置為55%的閾值,再來一次。

成功了!( ⊙ o ⊙ )!雖然多了個空格,但是已經完整識別出來了。
用node.js實現
最后在 node.js 中整合上面的操作,其中圖像處理用 graphicsmagick 代替。
直接上源碼吧,里面用到了 tesseract 和 graphicsmagick 在 node.js 中對應的包裝。
var fs = require('fs'); var tesseract = require('node-tesseract'); var gm = require('gm'); processImg('1.jpg', 'test_1.jpg') .then(recognizer) .then(text => { console.log(`識別結果:${text}`); }) .catch((err)=> { console.error(`識別失敗:${err}`); }); /** * 處理圖片為閾值圖片 * @param imgPath * @param newPath * @param [thresholdVal=55] 默認閾值 * @returns {Promise} */ function processImg (imgPath, newPath, thresholdVal) { return new Promise((resolve, reject) => { gm(imgPath) .threshold(thresholdVal || 55) .write(newPath, (err)=> { if (err) return reject(err); resolve(newPath); }); }); } /** * 識別圖片 * @param imgPath * @param options tesseract options * @returns {Promise} */ function recognizer (imgPath, options) { options = Object.assign({psm: 7}, options); return new Promise((resolve, reject) => { tesseract .process(imgPath, options, (err, text) => { if (err) return reject(err); resolve(text.replace(/[\r\n\s]/gm, '')); }); }); }
</div>
最后
寫完之后才發現示例中的驗證碼的第一個字符其實是 G,而不是識別出來的C。
默認樣本對相近字符識別還是挺低的,可以搜索 tesseract 訓練 ,提高相近字符的識別率。
資源
- node-tesseract tesseract的node包裝
- gm graphicsmagick的node包裝
- node-ocr-demo 還做了一個 demo 放在 github 上了
</ul> </div>
本文由用戶 DarrylHammo 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!