Разные результаты Тессеракта для 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 имеет оттенки серого, поэтому есть два способа исправить это:
Измени свой
SetImage
строка в соответствии с количеством каналов в изображении opencvocr.SetImage((uchar*)image.data, image.size().width, simageb.size().height, image.channels(), image.step1());
Преобразование изображения OpenCV в оттенки серого с 1 каналом
cv::cvtColor(image, image, CV_BGR2GRAY);