制作一个Node命令行图像识别工具

栏目: Node.js · 发布时间: 5年前

内容简介:从 0 开始制作一个 NodeJS 命令行验证码识别工具。实现如下效果。通常命令行工具入口名字为这样,我们告诉 *nix 系统,JavaScript 文件的解释器应该是

从 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 中。这里有几个注意点:

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;
复制代码

具体可以查看源码仓库: github.com/ringcrl/rec…


以上所述就是小编给大家介绍的《制作一个Node命令行图像识别工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Defensive Design for the Web

Defensive Design for the Web

37signals、Matthew Linderman、Jason Fried / New Riders / 2004-3-2 / GBP 18.99

Let's admit it: Things will go wrong online. No matter how carefully you design a site, no matter how much testing you do, customers still encounter problems. So how do you handle these inevitable bre......一起来看看 《Defensive Design for the Web》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换