如何制作一个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 tab 选项卡
Apr 26 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
Dec 30 Javascript
浅谈JavaScript Array对象
Dec 29 Javascript
JavaScript获取URL汇总
Jun 08 Javascript
jQuery Mobile框架中的表单组件基础使用教程
May 17 Javascript
原生js仿jquery animate动画效果
Jul 13 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 Javascript
简单实现vue验证码60秒倒计时功能
Oct 11 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
vue axios基于常见业务场景的二次封装的实现
Sep 21 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 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
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
2011/07/26 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
python实现文件快照加密保护的方法
2015/06/30 Python
python3调用R的示例代码
2018/02/23 Python
python学生信息管理系统(完整版)
2020/04/05 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
幼儿园门卫制度
2014/01/29 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
参赛口号
2014/06/16 职场文书
化工见习报告范文
2014/10/31 职场文书
保研推荐信格式
2015/03/25 职场文书
求职推荐信范文
2015/03/27 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
小学中队委竞选稿
2015/11/20 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技