【问题标题】:Different Tesseract result for Mat and PixMat 和 Pix 的不同 Tesseract 结果
【发布时间】:2018-09-02 10:28:27
【问题描述】:

目标

使用 OpenCV Mat 获得与使用 Leptonica Pix 使用 Tesseract 进行 OCR 时相同的质量结果。

环境

C++17、OpenCV 3.4.1、Tesseract 3.05.01、Leptonica 1.74.4、Visual Studio Community 2017、Windows 10 Pro 64 位

说明

我正在使用 Tesseract 和 OCR,并且发现了我认为的一种特殊行为。

这是我的输入图像:

这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;
using namespace cv;
using namespace tesseract;

void opencvVariant(string titleFile);
void leptonicaVariant(const char* titleFile);

int main()
{
    cout << "Tesseract with OpenCV and Leptonica" << endl;

    const char* titleFile = "raptor-companion-2.jpg";
    opencvVariant(titleFile);
    leptonicaVariant(titleFile);

    cout << endl;
    system("pause");
    return 0;
}

void opencvVariant(string titleFile) {

    cout << endl << "OpenCV variant..." << endl;

    TessBaseAPI ocr;
    ocr.Init(NULL, "eng");
    Mat image = imread(titleFile);
    ocr.SetImage(image.data, image.cols, image.rows, 1, image.step);

    char* outText = ocr.GetUTF8Text();
    int confidence = ocr.MeanTextConf();

    cout << "Text: " << outText << endl;
    cout << "Confidence: " << confidence << endl;
}

void leptonicaVariant(const char* titleFile) {

    cout << endl << "Leptonica variant..." << endl;

    TessBaseAPI ocr;
    ocr.Init(NULL, "eng");
    Pix *image = pixRead(titleFile);
    ocr.SetImage(image);

    char* outText = ocr.GetUTF8Text();
    int confidence = ocr.MeanTextConf();

    cout << "Text: " << outText << endl;
    cout << "Confidence: " << confidence << endl;
}

opencvVariantleptonicaVariant 方法基本相同,只是其中一个使用来自 OpenCV 的 Mat 类,另一个使用来自 Leptonica 的 Pix。然而,结果却大不相同。

OpenCV variant...
Text: Rapton


Confidence: 68

Leptonica variant...
Text: Raptor Companion


Confidence: 83

从上面的输出中可以看出,Pix 变体比Mat 变体提供了更好的结果。由于我的代码在 OCR 之前严重依赖 OpenCV 进行计算机视觉,因此 OCR 与 OpenCV 及其类一起工作对我来说至关重要。

问题

  • 为什么Pix 的结果比Mat 好,反之亦然?
  • 如何更改算法以使Mat 变体与Pix 变体一样高效?

【问题讨论】:

  • 你能不能试着用ocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());替换你的opencv setImage。默认情况下,imread 会读取彩色图像(即使它看起来像黑白),所以你可能只给 tessereact blue Mat 通道
  • @DmitriiZ。我用ocr.SetImage((uchar*)image.data, image.size().width, image.size().height, image.channels(), image.step1()); 替换了它,现在我得到了相同的结果!您应该写下您的评论作为答案! :-)

标签: c++ opencv ocr tesseract leptonica


【解决方案1】:

OpenCV imread 函数默认将图像读取为彩色,这意味着您获得的像素为BGRBGRBGR...
在您的示例中,您假设 opencv 图像是灰度的,因此有两种方法可以解决此问题:

  1. 根据 opencv 图像中的通道数更改您的 SetImage

    ocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());

  2. 将您的 opencv 图像转换为 1 通道的灰度

    cv::cvtColor(image, image, CV_BGR2GRAY);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多