如何制作一个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 相关文章推荐
js 分栏效果实现代码
Aug 29 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
javascript原型模式用法实例详解
Jun 04 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
Angular.js基础学习之初始化
Mar 10 Javascript
Extjs表单输入框异步校验的插件实现方法
Mar 20 Javascript
Easyui使用Dialog行内按钮布局的实例
Jul 27 Javascript
vue 注册组件的使用详解
May 05 Javascript
JS实现的tab页切换效果完整示例
Dec 18 Javascript
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
JavaScript动态检测密码强度原理及实现方法详解
Jun 11 Javascript
ZK中使用JS读取客户端txt文件内容问题
Nov 07 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使用数组实现队列
2012/02/05 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
php实例化一个类的具体方法
2019/09/19 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JavaScript 的继承
2011/10/01 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python查看微信撤回消息代码
2018/06/07 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python实现多层感知器
2019/01/18 Python
python实现根据文件格式分类
2019/10/31 Python
python实现梯度法 python最速下降法
2020/03/24 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
如何进行Linux分区优化
2013/02/12 面试题
农场厂长岗位职责
2013/12/28 职场文书
部队领导证婚词
2014/01/12 职场文书
消防先进事迹材料
2014/02/10 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
如何撰写创业策划书
2019/06/27 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python