Я использую OpenCV для извлечения фрагмента изображения из отсканированного документа и хотел бы использовать tesseract для выполнения OCR по этому фрагменту изображения. .
Я обнаружил, что могу использовать два метода распознавания текста в тессеракте, но пока не смог найти рабочего решения.
A.) Как преобразовать cv :: Mat
в PIX *
?
(PIX * - это тип данных leptonica )
Основываясь на приведенном ниже коде vasiles, это, по сути, мой текущий код:
cv::Mat image = cv::imread("c:/image.png");
cv::Mat subImage = image(cv::Rect(50, 200, 300, 100));
int depth;
if(subImage.depth() == CV_8U)
depth = 8;
//other cases not considered yet
PIX* pix = pixCreateHeader(subImage.size().width, subImage.size().height, depth);
pix->data = (l_uint32*) subImage.data;
tesseract::TessBaseAPI tess;
STRING text;
if(tess.ProcessPage(pix, 0, 0, &text))
{
std::cout << text.string();
}
Хотя он не дает сбоев или чего-то еще, результат распознавания все равно неверен. Он должен распознать одно слово моего образца изображения, но вместо этого он вернет некоторые нечитаемые символы.
Метод PIX_HEADER
не существует, поэтому я использовал pixCreateHeader
, но он не принимает количество каналов в качестве аргумента. Итак, как я могу установить количество каналов?
B.) Как я могу использовать cv :: Mat
для TesseractRect ()
?
Tesseract предлагает другой метод для текста распознавание с помощью этой подписи:
char * TessBaseAPI::TesseractRect (
const UINT8 * imagedata,
int bytes_per_pixel,
int bytes_per_line,
int left,
int top,
int width,
int height
)
В настоящее время я использую следующий код, но он также возвращает нечитаемые символы (хотя и другие, чем в приведенном выше коде.
char* cr = tess.TesseractRect(
subImage.data,
subImage.channels(),
subImage.channels() * subImage.size().width,
0,
0,
subImage.size().width,
subImage.size().height);