如何制作一个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 相关文章推荐
javascript开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
js的2种继承方式详解
Mar 04 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
Aug 26 Javascript
基于javascript实现随机颜色变化效果
Jan 14 Javascript
封装属于自己的JS组件
Jan 27 Javascript
理解javascript中的with关键字
Feb 15 Javascript
解析Node.js异常处理中domain模块的使用方法
Feb 16 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 Javascript
ES5新增数组的实现方法
May 12 Javascript
vue实现匀速轮播效果
Jun 29 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 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类
2006/10/09 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
javascript学习网址备忘
2007/05/29 Javascript
javascript 自动转到命名锚记
2009/01/10 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python callable()函数用法实例分析
2018/03/17 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
简单了解django缓存方式及配置
2019/07/19 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python相对企业语言优势在哪
2020/06/12 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
房屋过户委托书范本
2014/10/07 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
肖申克救赎观后感
2015/06/02 职场文书
我的中国梦主题班会
2015/08/14 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Django migrate报错的解决方案
2021/05/20 Python
详解python网络进程
2021/06/15 Python
青岛市的收音机研制与生产
2022/04/07 无线电