个性化阅读
专注于IT技术分析

Node.js中的Tesseract光学字符识别(OCR)入门

本文概述

假设你需要对书籍或印刷文档的页面进行数字化, 你将使用扫描仪创建真实页面的图像。但是, 尽管你有权编辑扫描文档的内容, 但是由于它是图像, 因此无法在计算机中对其进行编辑, 并且不能像将其视为数字文档一样简单地对其进行编辑。是的, 用户可以使用创建带有可选文本的PDF的程序, 然后他们可以执行所需的操作, 但是作为开发人员, 你可以为用户提供使用光学字符识别技术从图像中提取文本的可能性。为了实现将图像转换为文本的目标, 我们将使用用C ++编写的Tesseract将其安装在系统中, 然后将命令行与Node.js包装器一起使用。

在本文中, 你将学习如何在Tesseract的帮助下使用Node.js中的Javascript从图像中提取文本。

1.在你的系统中安装Tesseract

如本文所述, 为了使用光学字符识别API, 我们将使用Tesseract。 Tesseract是一个开放源代码的光学字符识别(OCR)引擎, 可以通过Apache 2.0许可获得。它可以直接通过API使用, 以从图像中提取打字, 手写或打印的文本。它支持多种语言(需要安装)。 Tesseract支持多种输出格式:纯文本, hocr(html)和pdf。

根据你使用的操作系统, Tesseract在系统中的安装过程会有所不同:

视窗

Windows中Tesseract的安装非常简单, 我们建议你使用Wiki中提到的非官方安装程序(tesseract-ocr-setup- <version> .exe)。你可以在tesseract的官方网站上获得所有可用设置的列表(始终下载最新版本)。

安装过程非常简单, 只需遵循向导即可。但是, 我们建议你直接在安装程序中安装tesseract所需的所有语言(仅安装所需的语言, 否则下载过程将花费很长时间), 然后在PATH中注册tesseract:

Tesseract Windows安装设置

等待安装完成, 你就可以开始了。你可以在新的命令提示符窗口tesseract -v(应该输出已安装的版本)中执行测试, 以确定它是否已正确安装。

的Ubuntu

使用以下命令安装Tesseract:

sudo apt-get install tesseract-ocr

然后, 安装你需要识别的语言(例如, 需要-deu, -fra, -eng和-spa english):

sudo apt-get install tesseract-ocr-eng

然后tesseract应该在任何终端上都可用, 因此以后我们的PHP脚本即可使用。

苹果系统

如果你使用的是Mac OS X, 则可以使用MacPorts或Homebrew安装tesseract:

MacPorts

要安装Tesseract, 请运行以下命令:

sudo port install tesseract

要安装任何语言数据, 请执行:

sudo port install tesseract-<langcode>

可在MacPorts tesseract页面上找到可用语言代码的完整列表。

家酿

要安装Tesseract, 请运行以下命令:

brew install tesseract

如果你需要更多信息或未列出你的操作系统, 请在此处参考Github中Tesseract信息库的Installation Wiki。

2.安装Tesseract Node.js包装器

为了使用Node.js处理Tesseract, 我们将使用@desmondmorris编写的最著名的Tesseract包装器。 node-tesseract模块是用于node.js的Tesseract OCR软件包的非常简单的包装, 它需要Tesseract 3.01或更高版本。

要将Node-tesseract模块安装在Node.js项目中, 请执行以下命令:

npm install node-tesseract

然后, 你将可以使用require(‘node-tesseract’)要求该模块。

3.处理图像

Node.js中包装器的使用非常简单, 它包含一个名为process的简单方法。此方法期望将要处理的图像的绝对或相对文件路径作为第一个参数, 将具有配置的对象作为第二个参数(使用默认设置是可选的), 并将命令结束时触发的回调作为第三个参数。

默认初始化

要处理图像, 需要使用node-tesseract模块并使用2个必需的参数(文件名和回调)调用process函数:

var tesseract = require('node-tesseract');

tesseract.process('image.jpeg', (err, text) => {
    if(err){
        return console.log("An error occured: ", err);
    }

    console.log("Recognized text:");
    // the text variable contains the recognized text
    console.log(text);
});

自订选项

options对象中的所有属性都是你通过命令行与tesseract一起使用的参数, 例如, 命令tesseract image.jpeg output_filename -l eng + deu -psm 6有4个参数, 但是第一个参数由你的代码设置, 并且其次是库, 这意味着需要在options对象中给出-l和-psm参数:

var tesseract = require('node-tesseract');

var options = {
    // Use the english and german languages
    l: 'eng+deu', // Use the segmentation mode #6 that assumes a single uniform block of text.
    psm: 6
};

tesseract.process('image.jpeg', options , (err, text) => {
    if(err){
        return console.log("An error occured: ", err);
    }

    console.log("Recognized text:");
    console.log(text);
});

已知的问题

当使用不同的语言(可能是大文件)时, 在执行脚本时可能会捕获以下异常:

Error :An error occured:  { Error: stderr maxBuffer exceeded
    at Socket.<anonymous> (child_process.js:278:14)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at Socket.Readable.push (_stream_readable.js:134:10)
    at Pipe.onread (net.js:548:20)</p>

导致此错误”超出stderr maxBuffer”的原因是, 用于使用node.js处理tesseract的child_process.exec杀死了进程, 因为标准输出的允许数据量不足(默认值为200KB)。为防止此错误, 你需要在流程选项中使用并设置maxBuffer属性。 node-tesseract允许你通过在env属性中提供一个对象来实现此目的:

var tesseract = require('node-tesseract');

var options = {
    // Use the english and german languages
    l: 'deu', // Use the segmentation mode #6 that assumes a single uniform block of text.
    psm: 6, // Increase the allowed amount of data in stdout to 16MB (A little exaggerated)
    env: {
        maxBuffer: 4096 * 4096
    }
};

tesseract.process('german.jpeg', options , (err, text) => {
    if(err){
        return console.log("An error occured: ", err);
    }

    console.log("Recognized text:");
    console.log(text);
});

注意:根据你的需要, 增加maxBuffer值。

最后, 我们建议你通过命令行阅读Tesseract用法文档, 以了解更多配置选项。

编码愉快!

赞(0)
未经允许不得转载:srcmini » Node.js中的Tesseract光学字符识别(OCR)入门

评论 抢沙发

评论前必须登录!