NodeJS 应用 Socket.io 实现 OCR 文字识别

OCR(Optical Character Recognition)是一种将图像中的文本转换为可编辑文本的技术,已经得到广泛应用。本文将介绍如何使用 NodeJS 应用 Socket.io 实现 OCR 文字识别的效果。

准备工作

在开始之前,你需要安装以下软件:

实现步骤

1. 创建项目

首先,打开命令行工具,进入你要保存项目的目录,执行以下命令:

解释一下这几个命令:

  • mkdir ocr:创建一个名为 ocr 的文件夹。
  • cd ocr:进入 ocr 文件夹。
  • npm init -y:初始化一个 NodeJS 项目,并使用默认设置。
  • npm i -S socket.io tesseract.js sharp:安装 socket.io 和 tesseract.js 以及 sharp 模块。

2. 创建服务器

我们需要先创建一个服务器,才能使用 Socket.io 实现 OCR 文字识别。在项目目录下,创建一个名为 server.js 的文件,输入以下代码:

const http = require('http');
const app = require('express')();
const server = http.createServer(app);
const io = require('socket.io')(server);
const sharp = require('sharp');
const Tesseract = require('tesseract.js');

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', socket => {
  console.log('a user connected');

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

server.listen(3000, () => {
  console.log('listening on *:3000');
});

我们在这个代码中引入了 httpsocket.io 模块,创建了一个 HTTP 服务器,并将其绑定到了 Socket.io 上。我们同样使用了 sharptesseract.js 模块,用于处理和识别图片中的文字。

3. 创建前端页面

我们需要一个前端页面来上传图片,和显示识别结果。创建一个 index.html 文件,输入以下代码:

<!DOCTYPE html>
<html>
  <head>
    <title>OCR 文字识别</title>
    <script src="https://cdn.socket.io/3.1.3/socket.io.min.js"></script>
  </head>
  <body>
    <form action="#" id="imageForm">
      <input type="file" id="imageInput">
      <button type="submit">识别</button>
    </form>
    <div id="resultTarget"></div>

    <script>
      const socket = io();
      const form = document.getElementById('imageForm');
      const input = document.getElementById('imageInput');
      const target = document.getElementById('resultTarget');

      form.addEventListener('submit', event => {
        event.preventDefault();
        if (input.files.length === 0) return;

        const file = input.files[0];
        const reader = new FileReader();

        reader.readAsBinaryString(file);
        reader.onload = () => {
          const data = btoa(reader.result);
          socket.emit('image', data);
        };
      });

      socket.on('result', result => {
        target.textContent += `\n${result}`;
      });
    </script>
  </body>
</html>

这个页面很简单,包括一个上传图片的表单和一个用于显示识别结果的目标元素。这个页面还引入了 Socket.io 库,用于在前端页面和服务器之间建立 WebSocket 连接。

4. 上传图片和识别文字

现在,我们需要添加一些逻辑来实现识别文字的功能。在 server.js 中,添加以下的代码:

io.on('connection', socket => {
  console.log('a user connected');

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });

  socket.on('image', async data => {
    try {
      const buffer = Buffer.from(data, 'base64');
      const image = sharp(buffer);

      const { data: imageData, info: imageInfo } = await image.toBuffer({ resolveWithObject: true });
      const text = await Tesseract.recognize(imageData, {
        lang: 'chi_tra',
        tessedit_char_whitelist: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,.',
      });

      const result = text.data.text.replace(/\n/g, '');

      socket.emit('result', result);
    } catch (err) {
      console.error('Error:', err);
    }
  });
});

这段代码中,我们添加了一个 image 事件监听,用于监听前端页面上传图片时的事件。当收到上传的图片事件时,我们先将图片转换为 Buffer 数据,然后用 Sharp 处理一下图像,以便后续进行识别操作。之后使用 tesseract.js 对这个图像进行文字识别,并将识别结果发送到前端页面。

5. 运行服务器

现在,我们已经完成了 OCR 文字识别的所有代码工作,可以运行服务器了。在命令行中,执行以下命令:

打开浏览器,访问 http://localhost:3000,上传需要识别的图片,点击 "识别" 按钮,即可看到识别结果出现在页面上了。

总结

本文主要介绍了如何使用 NodeJS 应用 Socket.io 实现 OCR 文字识别,通过这个实例,我们深入了解了 Socket.io 和 tesseract.js 的使用方法,同时也学习了如何处理和识别图片中的文字。如果你想将这个实例进一步地完善,你可以尝试优化图片处理的算法,或者增加一个基于 Firebase 的数据库来保存识别的结果。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65901f2ceb4cecbf2d59e282


纠错
反馈