如何制作一个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获取url参数的使用扩展实例
Dec 29 Javascript
js读取注册表的键值示例
Sep 25 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
chrome下jq width()方法取值为0的解决方法
May 26 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
微信小程序 SocketIO 实例讲解
Oct 13 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 Javascript
vue2.x数组劫持原理的实现
Apr 19 Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
php fread读取文件注意事项
2016/09/24 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python二叉树遍历的实现方法
2013/11/21 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
python中map()函数的使用方法示例
2017/09/29 Python
详解Python中where()函数的用法
2018/03/27 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
浅析python标准库中的glob
2020/03/13 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
数控专业大学生的自我鉴定
2013/11/13 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
表彰大会策划方案
2014/05/13 职场文书
机械系毕业生求职信
2014/05/28 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
入党团支部推荐意见
2015/06/02 职场文书
Python类方法总结讲解
2021/07/26 Python