Разные результаты Тессеракта для Mat и Pix

Цель

Получение такого же качественного результата при использовании OpenCV Mat как при использовании лептоники Pix при выполнении оптического распознавания текста с Tesseract.

Среда

C++17, OpenCV 3.4.1, Tesseract 3.05.01, Leptonica 1.74.4, Visual Studio Community 2017, 64-разрядная версия Windows 10 Pro

Описание

Я работаю с 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;
}

Методы opencvVariant а также leptonicaVariant в основном то же самое, за исключением того, что один использует класс Mat из OpenCV и других Pix из Лептоники. Тем не менее, результат совсем другой.

OpenCV variant...
Text: Rapton


Confidence: 68

Leptonica variant...
Text: Raptor Companion


Confidence: 83

Как видно из результатов выше, Pix вариант дает гораздо лучший результат, чем Mat вариант. Поскольку мой код в значительной степени опирается на OpenCV для компьютерного зрения до OCR, для меня важно, чтобы OCR хорошо работал с OpenCV и его классами.

Вопросы

  • Почему Pix дать лучший результат, чем Mat, и наоборот?
  • Как можно изменить алгоритм, чтобы сделать Mat вариант так же эффективен, как Pix вариант?

1 ответ

Решение

OpenCV imread функция по умолчанию читает изображение как цветное, что означает, что вы получите пиксели как BGRBGRBGR...,
В вашем примере вы предполагаете, что изображение opencv имеет оттенки серого, поэтому есть два способа исправить это:

  1. Измени свой SetImage строка в соответствии с количеством каналов в изображении opencv

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

  2. Преобразование изображения OpenCV в оттенки серого с 1 каналом

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

Другие вопросы по тегам