如何制作一个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 相关文章推荐
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
基于jquery实现放大镜效果
Aug 17 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
AngularJs  E2E Testing 详解
Sep 02 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
JavaScript获取服务器时间的方法详解
Dec 11 Javascript
JavaScript html5利用FileReader实现上传功能
Mar 27 Javascript
详解angularjs实现echart图表效果最简洁教程
Nov 29 Javascript
8个有意思的JavaScript面试题
Jul 30 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
cypress测试本地web应用
Jun 01 Javascript
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调用.NET的WebService 简单实例
2015/03/27 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php微信开发接入
2016/08/27 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
中学生差生评语
2014/01/30 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
银行办公室岗位职责
2014/03/10 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
离职告别感言
2015/08/04 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python