如何制作一个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 相关文章推荐
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
jQuery setTimeout()函数使用方法
Apr 07 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
js实现文本上下来回滚动
Feb 03 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
详解如何提高 webpack 构建 Vue 项目的速度
Jul 03 Javascript
VUE中的无限循环代码解析
Sep 22 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
Sep 26 Javascript
JavaScript实现拖拽功能
Feb 11 Javascript
vue单元格多列合并的实现
Nov 26 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
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python中list初始化方法示例
2016/09/18 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Django中间件实现拦截器的方法
2018/06/01 Python
解决DataFrame排序sort的问题
2018/06/07 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
Python装饰器结合递归原理解析
2020/07/02 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
.net工程师笔试题
2012/06/09 面试题
毕业生求职简历中的自我评价
2013/10/18 职场文书
关于迟到的检讨书
2014/01/26 职场文书
个性与发展自我评价
2014/02/11 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
表彰大会主持词
2014/03/26 职场文书
学习与创新自我评价
2015/03/09 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python