Я пытаюсь распознать текст из обрезанного изображения, но мне нужно передать его из 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;
}
Проблема, кажется, в сером изображении. Как указывает заголовок 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();
...