如何制作一个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显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
Jul 09 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
JavaScript模拟push
Mar 06 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
Nov 20 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
Sep 27 Javascript
微信小程序实现九宫格抽奖
Apr 15 Javascript
js将URL网址转为16进制加密与解密函数
Mar 04 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
Mar 17 Javascript
解读Vue组件注册方式
May 15 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生成HTML静态页面实例代码
2008/08/31 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
Python实现获取命令行输出结果的方法
2017/06/10 Python
python决策树之C4.5算法详解
2017/12/20 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python excel转换csv代码实例
2019/08/26 Python
pandas的resample重采样的使用
2020/04/24 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
.NET初级开发工程师面试题
2014/04/18 面试题
结婚保证书(三从四德)
2015/02/26 职场文书
新郎结婚保证书
2015/02/26 职场文书
狂人日记读书笔记
2015/06/30 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
小学教师教育随笔
2015/08/14 职场文书
污染环境建议书
2015/09/14 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers