Tesseract-Ocr и OpenCV / tesseract-ocr / Recog.ru - Распознавание образов для программистов


Tesseract-Ocr и OpenCV

В предыдущем посте http://recog.ru/blog/tesseract-ocr/191.html приведен базовый пример работы с Tesseract-Ocr. Модифицируем его таким образом, чтобы работать с OpenCV картинками.
#include <baseapi.h>
#include <allheaders.h>
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui_c.h"

int main() {

        tesseract::TessBaseAPI *myOCR = 
                new tesseract::TessBaseAPI();

		printf("Tesseract-ocr version: %s\n",
               myOCR->Version());
        printf("Leptonica version: %s\n",
               getLeptonicaVersion());


        if (myOCR->Init(NULL, "rus")) {
          fprintf(stderr, "Could not initialize tesseract.\n");
          exit(1);
        }
        
		IplImage* Image = cvLoadImage( "test.tif" );		
		char outText[10000];
		myOCR->SetImage( (uchar*)Image->imageData, Image->width, Image->height, Image->nChannels, Image->widthStep );
		myOCR->Recognize(0);		        
		
		lstrcpy( outText, myOCR->GetUTF8Text() );		
        printf( "OCR output:\n\n");
        printf(outText);
        
        myOCR->Clear();
        myOCR->End();        

		cvReleaseImage( &Image );
        return 0;
}

Результат распознавания такой же, как и в предыдущем посте. Здесь используется функция SetImage для того, чтобы указать на данные, ширину, высоту, количество каналов, и шаг строки изображения. Больше каких-то сложностей нет.

Если мы хотим распознавать символы отдельно, то можно использовать отдельное изображение:

Это два примера изображения, которые будут распознаваться. А ниже код, который это делает:
#include <baseapi.h>
#include <allheaders.h>
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui_c.h"

int main() {

        tesseract::TessBaseAPI *myOCR = 
                new tesseract::TessBaseAPI();

		printf("Tesseract-ocr version: %s\n",
               myOCR->Version());
        printf("Leptonica version: %s\n",
               getLeptonicaVersion());


        if (myOCR->Init(NULL, "eng")) {
          fprintf(stderr, "Could not initialize tesseract.\n");
          exit(1);
        }
        myOCR->SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
		myOCR->SetVariable("tessedit_char_whitelist","ABCEHMO");

		IplImage* Image = cvLoadImage( "a.jpg" );		
		char outText[10000];		
		myOCR->SetImage( (uchar*)Image->imageData, Image->width, Image->height, Image->nChannels, Image->widthStep );
		myOCR->Recognize(0);		        
		
		lstrcpy( outText, myOCR->GetUTF8Text() );		
        printf( "OCR output:\n\n");
        printf(outText);
        
        myOCR->Clear();
        myOCR->End();        

		cvReleaseImage( &Image );
        return 0;
}

Функция SetPageSegMode задает режим распознавания односимвольный. SetVariable устанавливает список допустимых символов. Ну а далее тоже самое. Все распознается верно.
  • 0
  • 01 июня 2013, 20:35
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.