如何制作一个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 ajax 路由和过滤器使用说明
Aug 02 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
js实现文字跑马灯效果
Feb 23 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
Feb 26 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
Sep 04 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 Javascript
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 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
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
php查询内存信息操作示例
2019/05/09 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
利用Python开发微信支付的注意事项
2016/08/19 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python线程的几种创建方式详解
2019/08/29 Python
python argparser的具体使用
2019/11/10 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
娱乐地球:Entertainment Earth
2020/01/08 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
一道Delphi上机题
2012/06/04 面试题
外贸采购员岗位职责
2014/03/08 职场文书
小学优秀教师材料
2014/12/15 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
15个值得收藏的JavaScript函数
2021/09/15 Javascript
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL