преобразование cv :: Mat для tesseract

Я использую 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);   

15
задан Pedro 14 November 2011 в 18:21
поделиться