如何制作一个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获取字符串最后一位方法汇总
Nov 13 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
关于微信中a链接无法跳转问题
Aug 02 Javascript
jQuery绑定事件的四种方式介绍
Oct 31 Javascript
BootStrap3使用错误记录及解决办法
Dec 22 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
使用原生js封装的ajax实例(兼容jsonp)
Oct 12 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
浅析vue-router原理
Oct 19 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
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
PHP分页显示制作详细讲解
2008/11/19 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
实现PHP搜索加分页
2016/10/12 PHP
告诉大家什么是JSON
2008/06/10 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
django+echart数据动态显示的例子
2019/08/12 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
合作协议书范文
2014/08/20 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
升学宴来宾致辞
2015/07/27 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
HTML基础详解(下)
2021/10/16 HTML / CSS
浅谈MySQL中的六种日志
2022/03/23 MySQL
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers