如何制作一个Node命令行图像识别工具


Posted in Javascript onDecember 12, 2018

从 0 开始制作一个 NodeJS 命令行验证码识别工具。实现如下效果。

如何制作一个Node命令行图像识别工具 

初始化项目

# 创建 recognition 项目
mkdir recognition
cd recognition
npm init -y

# 安装主依赖
yarn add images tesseract.js

# 安装工具依赖
yarn add chalk yargs

# 可选依赖
yarn add socks5-http-client

依赖说明

images :Node.js 轻量级跨平台图像编码库,用于处理下载下来的图片

tesseract.js :纯 JS 实现的 OCR(光学字符识别)工具,用于图像内容识别

chalk :让命令行内容样式好看

yargs :命令行参数解析器

socks5-http-client :SOCKS v5,用于设置代理,在需要拉取某些不能直接访问的资源时使用, request proxy 例子

项目准备

新建 cli.js

通常命令行工具入口名字为 cli.js ,我们新建一个 cli.js 文件,并在开头写上:

#!/usr/bin/env node

这样,我们告诉 *nix 系统,JavaScript 文件的解释器应该是 /usr/bin/env node ,它查找本地安装的 node

配置 bin

// package.json
{
 "bin": {
  "reg": "./cli.js"
 }
}

这样配置完成后,别人 npm install -g @chenng/recognition 的包,就可以直接通过命令行运行了:

reg --url=https://static.chenng.cn/imgs/test_img.png

link 本地开发

我们如何能够在本地可以使用 rec 命令呢?只需要把本项目 link 即可:

yarn link

核心逻辑

主要逻辑在 cli.jsrecognize.js 中。这里有几个注意点:

  • request 图片的时候要设置 encoding: null,否则返回的是乱码
  • 初次使用的时候需要下载训练集,需要花点时间
const Tesseract = require('tesseract.js');
const images = require('images');
const requset = require('request');
const fs = require('fs');
const { promisify } = require('util');
const chalk = require('chalk');

const writeFile = promisify(fs.writeFile);
const rp = promisify(requset);

class Recognize {
 constructor(url) {
  Recognize.downloadDir = `${__dirname}/dist/`;
  Recognize.downloadFile = `${__dirname}/dist/temp.png`;
  this.url = url;
  this.start();
 }

 async start() {
  const data = await this.downloadImg();
  await writeFile(Recognize.downloadFile, data);
  this.recognize();
  const result = await Tesseract.recognize(Recognize.downloadFile, {
   lang: 'eng',
   tessedit_char_blacklist: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
  });

  console.log(`

   识别成功!
   识别结果为:${chalk.green(result.text)}
  `);
 }

 async downloadImg() {
  if (!fs.existsSync(Recognize.downloadDir)) {
   fs.mkdirSync(Recognize.downloadDir);
   console.log(`创建了 ${Recognize.downloadDir} 文件夹`);
  }
  
  const res = await rp({
   url: this.url,
   method: 'GET',
   encoding: null,
  });
  return res.body;
 }

 recognize() {
  // 放大图片,并覆盖源文件
  images(Recognize.downloadFile)
   .size(400)
   .save(Recognize.downloadFile);
 }
 
}

module.exports = Recognize;

具体可以查看源码仓库: https://github.com/ringcrl/recognition

发布上线

# 新建代码仓库,git push

# 登录到 npm
npm adduser

# 发包
npm publish --access public

# 全局安装
npm install -g @chenng/recognition

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
namespace.js Javascript的命名空间库
Oct 11 Javascript
判断对象是否Window的实现代码
Jan 10 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
浅谈Jquery为元素绑定事件
Apr 27 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
jQuery EasyUI封装简化操作
Sep 18 Javascript
微信小程序 石头剪刀布实例代码
Jan 04 Javascript
jQuery动态产生select option下拉列表
Mar 15 Javascript
angular内置provider之$compileProvider详解
Sep 27 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
vue 表单输入格式化中文输入法异常问题
May 30 Javascript
jquery自定义组件实例详解
Dec 31 jQuery
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
Dec 12 #Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 #Javascript
微信小程序自定义导航教程(兼容各种手机)
Dec 12 #Javascript
express express-session的使用小结
Dec 12 #Javascript
解决vue移动端适配问题
Dec 12 #Javascript
js中位运算的运用实例分析
Dec 11 #Javascript
js中的数组对象排序分析
Dec 11 #Javascript
You might like
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
javascript 函数式编程
2007/08/16 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
Python对象转JSON字符串的方法
2016/04/27 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
Python之Class&Object用法详解
2019/12/25 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
新教师个人工作总结
2015/02/06 职场文书
行政前台岗位职责
2015/04/16 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL