如何制作一个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的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
jquery学习笔记二 实现可编辑的表格
Apr 09 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
IE6兼容透明背景图片及解决方案
Aug 19 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
js实现左右两侧浮动广告
Jul 09 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
Electron整合React使用搭建开发环境的步骤详解
Jun 07 Javascript
简单了解常用的JavaScript 库
Jul 16 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
基于python操作ES实例详解
2019/11/16 Python
python调用接口的4种方式代码实例
2019/11/19 Python
python 初始化一个定长的数组实例
2019/12/02 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
会计学生自我鉴定
2014/02/06 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
赔偿协议书
2015/01/27 职场文书
横店影视城导游词
2015/02/06 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
MySQL 原理与优化之Update 优化
2022/08/14 MySQL