用node.js實現驗證碼簡單識別

DarrylHammo 8年前發布 | 26K 次閱讀 Node.js 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 訓練 ,提高相近字符的識別率。

資源

 本文由用戶 DarrylHammo 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!