Как я могу использовать tesseract и opencv для извлечения текста из камеры

Я использую tesseract 3.02 и opencv, чтобы tesseract распознавал текст с моей камеры в реальном времени.

Но эффект очень плохой. Результаты нечитаемы и не могут отображать изображение плавно. Я думаю, что это проблема моего кода.

Может ли кто-нибудь дать мне совет о том, как изменить его?

Большое спасибо!

#include "stdafx.h"
#include <string>
#include <opencv2/opencv.hpp>
#include <time.h>


using namespace std;
using namespace cv;


int main() {

    // [1]
    tesseract::TessBaseAPI *myOCR = 
            new tesseract::TessBaseAPI();

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

    // [3]
    if (myOCR->Init(NULL, "eng")) {
      fprintf(stderr, "Could not initialize tesseract.\n");
      exit(1);
    }

    //声明IplImage指针
    IplImage* pFrame = NULL;

    //获取摄像头
    CvCapture* pCapture = cvCreateCameraCapture(-1);

    //创建窗口
    cvNamedWindow("video", 1);

    //显示视屏
            time_t last_time = time(NULL);
    while(1)
    {

        pFrame=cvQueryFrame( pCapture );
        if(!pFrame)    break;
        cvShowImage("video",pFrame);
        char c=cvWaitKey(33);
        if(c==27)break;

                time_t this_time = time(NULL);
                if(this_time != last_time)
                {
                    last_time = this_time;
        myOCR->SetRectangle(0,0,pFrame->width,pFrame->height);
        myOCR->SetImage((uchar*)pFrame->imageData,pFrame->width,pFrame-   >height,pFrame->depth/8,pFrame->width*(pFrame->depth/8));
        myOCR->Recognize(NULL);
        const char* out = myOCR->GetUTF8Text();
        printf("%s\n",out);
                }

    }
    cvReleaseCapture(&pCapture);
    cvDestroyWindow("video");
    cv::waitKey(-1);
            return 0;
}

person user1866046    schedule 26.12.2012    source источник


Ответы (1)


Tesseract был разработан для обработки отсканированных книг. Он работает на белых страницах, где есть только черный текст, хорошо видимый с минимальными искажениями. Изображения в основном черно-белые. Ваше изображение имеет уровень серого, поэтому Tesseract будет работать очень плохо. Это проблема не вашего кода, а Tesseract. Если вы направите камеру на книгу, вы сможете получить текст (при условии, что изображение сфокусировано), но если вы хотите прочитать общий текст (например, уличные знаки, логотип на чьей-то футболке, то это невозможно сделать Извините, что разочаровал вас.

Однако, если вы хотите распознать определенный текст, например номера кредитных карт или уличные знаки, вы можете это сделать.

  1. Начните с захвата множества изображений вашего текста.
  2. Сделайте небольшую предварительную обработку изображения, конвертируйте его в ЧБ,
  3. обучать Tesseract на многих примерах.

И тогда он сможет выполнить свою задачу.

person DanielHsH    schedule 27.12.2012
comment
Спасибо за информацию. Распознавание текста из книги мне тоже подходит. Но я не только столкнулся с проблемой точности. Другая проблема заключается в том, что он не может отображать изображение плавно. Задержка очень серьезная. Я думаю, это, вероятно, потому, что я распознаю каждый кадр. Я хочу знать, как его стабилизировать? Должен ли я сделать что-то вроде скриншота или что? Я просто хочу, чтобы он показывал текст, на который указывает моя камера. Так что я думаю, что мой код все еще имеет некоторые проблемы - person user1866046; 27.12.2012
comment
Я понимаю, что вы говорите. Тебе следует - person DanielHsH; 27.12.2012
comment
Я понимаю, что вы говорите. Вам нужно запустить алгоритм стабилизации изображения (сопоставить последовательные изображения). Из тессеракта вы можете получить ящики (расположение каждой буквы на изображении). Затем вы запускаете его один раз в 1 [сек], сохраняете коробки и просто рисуете их в соответствии с движением камеры. - person DanielHsH; 27.12.2012
comment
Я пробовал это, но это не решает проблему распознавания. Я направил камеру на книгу, но она все равно не читается. Я опубликую свой код. Можете ли вы помочь мне проверить, если что-то не так? Это будет очень полезно. Большое спасибо! - person user1866046; 03.01.2013