如何制作一个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 相关文章推荐
载入进度条 效果
Jul 08 Javascript
硬盘浏览程序,保存成网页格式便可使用
Dec 03 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
jQuery Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
Vue组件创建和传值的方法
Aug 17 Javascript
jQuery实现的中英文切换功能示例
Jan 11 jQuery
Vue 理解之白话 getter/setter详解
Apr 16 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 Javascript
解决Layui中templet中a的onclick参数传递的问题
Sep 20 Javascript
JavaScript实现点击切换功能
Jan 27 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
php 常用类整理
2009/12/23 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
php微信开发之图片回复功能
2018/06/14 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
python编程实现希尔排序
2017/04/13 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Python对象的属性访问过程详解
2020/03/05 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
硕士研究生个人求职信
2013/12/04 职场文书
公司同意接收函
2014/01/13 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB