Mat和Pix的不同Tesseract结果

时间:2018-03-23 16:57:13

标签: c++ opencv ocr tesseract leptonica

目标

使用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,并且发现了我认为是一种特殊的行为。

这是我的输入图片: Input image for the 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变体一样高效?

1 个答案:

答案 0 :(得分:4)

默认情况下,OpenCV imread功能会将图像显示为彩色,这意味着您将像素设为BGRBGRBGR...
在您的示例中,您假设opencv图像是灰度图像,因此有两种方法可以解决这个问题:

  1. 根据opencv image

    中的频道数更改SetImage

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

  2. 使用1个频道将opencv图像转换为灰度

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