Преобразование Mat в PIX для setImage

Я пытаюсь распознать текст из обрезанного изображения, но мне нужно передать его из Mat в PIX потому что X-Platform кодирует.

Я старался этот, этот а также этот

И делает ту же функцию, передавая Mat а также PIX с одним и тем же изображением, результаты очень сильно отличаются (с PIX работает отлично, с Mat это запутано).

Что я, вероятно, делаю плохо?

Благодарю.

PD: (Это один из фрагментов кода, который я использую)

String imgToString(const char* variables, Mat gray) {
char *outText;

tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng")) {
String returnString = "Could not initialize tesseract.\n";
fprintf(stderr, "Could not initialize tesseract.\n");
return returnString;
}
api->SetVariable("tessedit_char_whitelist", variables);

// Open input image with leptonica library
api->TesseractRect(gray.data, 1, gray.channels() * gray.size().width, 0, 0, gray.cols, gray.rows);
// Get OCR result
outText = api->GetUTF8Text();
return outText;
}

// The one below works fantastic

String imgToString(const char* variables, const char* filename) {
char *outText;

tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng")) {
String returnString = "Could not initialize tesseract.\n";
fprintf(stderr, "Could not initialize tesseract.\n");
return returnString;
}
api->SetVariable("tessedit_char_whitelist", variables);

// Open input image with leptonica library
Pix *image = pixRead(filename);
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
return outText;
}

1

Решение

Проблема, кажется, в сером изображении. Как указывает заголовок tesseract pix.h, библиотека работает с изображениями с глубиной 32 бит на пиксель. Тессеракт также взвешивает цвета, поэтому их нужно правильно выравнивать (по умолчанию opencv сохраняет цвета как BGR, но тессеракт ждет RGBA). Продолжить:

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <opencv2/opencv.hpp>
...
char imagename[] = "testimg.jpg";
cv::Mat _mat = cv::imread(imagename);
cv::cvtColor(_mat, _mat, CV_BGR2RGBA);
api.SetImage(_mat.data, _mat.cols, _mat.rows, 4, 4*_mat.cols);
char *outtext = api.GetUTF8Text();
...
1

Другие решения


По вопросам рекламы [email protected]