如何制作一个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 相关文章推荐
Json对象替换字符串占位符实现代码
Nov 17 Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
Aug 18 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
在Vue组件中获取全局的点击事件方法
Sep 06 Javascript
JS 数组随机洗牌的实例代码
Sep 12 Javascript
微信小程序下拉框功能的实例代码
Nov 06 Javascript
Three.js中矩阵和向量的使用教程
Mar 19 Javascript
Vue基本指令实例图文讲解
Feb 25 Vue.js
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 curl选项列表(超详细)
2013/07/01 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php curl常用的5个经典例子
2017/01/20 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python Socket使用实例
2017/12/18 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
作文评语大全
2014/04/23 职场文书
给校长的建议书200字
2014/05/16 职场文书
政府四风问题整改措施
2014/10/04 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
Mysql Show Profile
2021/04/05 MySQL