概述
NodeJS模块-Tesseract识别验证码图片,在验证码识别上,node.js
其实也只是打酱油的角色,因为已经有成熟的工具做这个事情,而node
只需要做调度就行了。
所需工具
那么介绍一下这些工具吧
Tesseract
开源的OCR
识别工具,目前由Google
维护,支持中文,默认的识别率很低哈,特别是中文,但是可以自己提供样本,训练提高识别率。graphicsmagick
非常实用的图像处理工具,下面会讲到用途。
安装
npm install node-tesseract
npm中的示例
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
var tesseract = require('node-tesseract'); // Recognize text of any language in any format tesseract.process(__dirname + '/path/to/image.jpg',function(err, text) { if(err) { console.error(err); } else { console.log(text); } }); // Recognize German text in a single uniform block of text and set the binary path var options = { l: 'deu', psm: 6, binary: '/usr/local/bin/tesseract' }; tesseract.process(__dirname + '/path/to/image.jpg', options, function(err, text) { if(err) { console.error(err); } else { console.log(text); } }); |
用node.js实现
最后在node.js
中整合上面的操作,其中图像处理用 graphicsmagick
代替。
直接上源码吧,里面用到了 tesseract
和 graphicsmagick
在node.js
中对应的包装。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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, '')); }); }); } |
识别语言
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
language: https://github.com/tesseract-ocr/tessdata afr --- Afrikaans(南非荷兰语) amh --- Amharic(阿姆哈拉语) ara --- Arabic(阿拉伯语) asm --- Assamese(阿萨姆) aze --- Azerbaijani(阿塞拜疆) aze_cyrl --- Azerbaijani - Cyrilic(阿塞拜疆-Cyrilic) bel --- Belarusian(白俄罗斯) ben --- Bengali(孟加拉) bod --- Tibetan(西藏) bos --- Bosnian(波斯尼亚) bul --- Bulgarian(保加利亚语) cat --- Catalan; Valencian(加泰罗尼亚语; 巴伦西亚) ceb --- Cebuano(宿务) ces --- Czech(捷克) chi_sim --- Chinese - Simplified(中国-简体) chi_tra --- Chinese - Traditional(中国-繁体) chr --- Cherokee(切诺基) cym --- Welsh(威尔士) dan --- Danish(丹麦) dan_frak --- Danish - Fraktur(丹麦-Fraktur) deu --- German(德国) deu_frak --- German - Fraktur(德国-Fraktur) dzo --- Dzongkha(不丹文) ell --- Greek, Modern (1453-)(希腊,现代(1453-)) eng --- English(英语) enm --- English, Middle (1100-1500)(英语,中东(1100-1500)) epo --- Esperanto(世界语) equ --- Math / equation detection module(数学/方程式检测模块) est --- Estonian(爱沙尼亚) eus --- Basque(巴斯克) fas --- Persian(波斯) fin --- Finnish(芬兰) fra --- French(法语) frk --- Frankish(法兰克) frm --- French, Middle (ca.1400-1600)(法国,中东(ca.1400-1600)) gle --- Irish(爱尔兰) glg --- Galician(加利西亚) grc --- Greek, Ancient (to 1453)(希腊语,古(到1453年)) guj --- Gujarati(古吉拉特语) hat --- Haitian; Haitian Creole(海天; 海地克里奥尔语) heb --- Hebrew(希伯来语) hin --- Hindi(印地文) hrv --- Croatian(克罗地亚) hun --- Hungarian(匈牙利) iku --- Inuktitut(因纽特语) ind --- Indonesian(印尼) isl --- Icelandic(冰岛) ita --- Italian(意大利语) ita_old --- Italian - Old(意大利语-旧) jav --- Javanese(爪哇) jpn --- Japanese(日本) kan --- Kannada(卡纳达语) kat --- Georgian(格鲁吉亚) kat_old --- Georgian - Old(格鲁吉亚-旧) kaz --- Kazakh(哈萨克斯坦) khm --- Central Khmer(中央高棉) kir --- Kirghiz; Kyrgyz(柯尔克孜; 吉尔吉斯) kor --- Korean(韩国) kur --- Kurdish(库尔德人) lao --- Lao(老挝) lat --- Latin(拉丁) lav --- Latvian(拉脱维亚) lit --- Lithuanian(立陶宛) mal --- Malayalam(马拉雅拉姆语) mar --- Marathi(马拉) mkd --- Macedonian(马其顿) mlt --- Maltese(马耳他) msa --- Malay(马来文) mya --- Burmese(缅甸) nep --- Nepali(尼泊尔) nld --- Dutch; Flemish(荷兰; 佛兰芒语) nor --- Norwegian(挪威) ori --- Oriya(奥里亚语) osd --- Orientation and script detection module(定位及脚本检测模块) pan --- Panjabi; Punjabi(旁遮普语; 旁遮普语) pol --- Polish(波兰) por --- Portuguese(葡萄牙语) pus --- Pushto; Pashto(普什图语; 普什图语) ron --- Romanian; Moldavian; Moldovan(罗马尼亚; 摩尔多瓦; 摩尔多瓦) rus --- Russian(俄罗斯) san --- Sanskrit(梵文) sin --- Sinhala; Sinhalese(僧伽罗语; 僧伽罗语) slk --- Slovak(斯洛伐克) slk_frak --- Slovak - Fraktur(斯洛伐克- Fraktur) slv --- Slovenian(斯洛文尼亚) spa --- Spanish; Castilian(西班牙语; 卡斯蒂利亚) spa_old --- Spanish; Castilian - Old(西班牙语; 卡斯蒂利亚-老) sqi --- Albanian(阿尔巴尼亚) srp --- Serbian(塞尔维亚) srp_latn --- Serbian - Latin(塞尔维亚语-拉丁语) swa --- Swahili(斯瓦希里语) swe --- Swedish(瑞典) syr --- Syriac(叙利亚) tam --- Tamil(泰米尔) tel --- Telugu(泰卢固语) tgk --- Tajik(塔吉克斯坦) tgl --- Tagalog(菲律宾语) tha --- Thai(泰国) tir --- Tigrinya(提格雷语) tur --- Turkish(土耳其) uig --- Uighur; Uyghur(维吾尔族; 维吾尔) ukr --- Ukrainian(乌克兰) urd --- Urdu(乌尔都语) uzb --- Uzbek(乌兹别克斯坦) uzb_cyrl --- Uzbek - Cyrilic(乌兹别克斯坦- Cyrilic) vie --- Vietnamese(越南语) yid --- Yiddish(意第绪语) |
最后
写完之后才发现示例中的验证码的第一个字符其实是 G,而不是识别出来的C。
默认样本对相近字符识别还是挺低的,可以搜索 tesseract 训练
,提高相近字符的识别率。
资源
- node-tesseract tesseract的node包装
- gm graphicsmagick的node包装
- node-ocr-demo 还做了一个 demo 放在 github 上了