2016-05-07 12 views
1

編集::コードの変更があり、少なくとも空のページエラーが発生していません。以下のコードを更新してください。OpenCV3のOCRTesseractが比較的単純な画像で正しく機能しない

私はOpenCV3とTesseractを使用していて、比較的単純なイメージで処理していますが、ocrの部分が円滑に動作することを期待していましたが、そうではありません。

画像:Image to run OCR on

コード:

Ptr<cv::text::OCRTesseract> ocr = 
    cv::text::OCRTesseract::create(NULL /*datapath*/, "eng" /*lang*/, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" /*whitelist*/, 2 /*oem*/, 10 /*psmode*/); 

string output; 
vector<Rect> boxes; 
vector<string> words; 
vector<float> confidences; 
ocr->run(gray3, output, &boxes, &words, &confidences, cv::text::OCR_LEVEL_WORD); 

出力:

I 

何が起こっているすべてのアイデア?

ありがとうございました。

+0

あなたの入力は「私」のように見えます。あなたの質問は何ですか? –

+0

イメージは明らかに私ではありません、私は検出を良くするために何ができますか? – Ahsan

+1

罫線に接続されたブロブを削除しようとしましたか?これは、出力を向上させるのに役立ちます。それ以外の場合は、より良い結果を得るためにtesseract-ocrのトレーニングを検討する必要があります。 –

答えて

1

境界に接続されたブロブを削除すると、効果が向上します。だから、私たちはあなたのイメージを取る:

example あなたは文字が白、背景黒であるので、画像を反転したい:

Mat img = imread("T2.png"); // reading the example image 
    cvtColor(img, img, CV_RGB2GRAY); 
    bitwise_not(img, img); // invert the image 

その後、我々はfloodFillメソッドを使用して国境に接続されているブロブを削除したい

:これは、次の画像が生成されます

// Remove blobs attached on corners 
    uchar white(255); 
    // do top and bottom row 
    for (int y = 0; y < img.rows; y += img.rows - 1) 
    { 
     uchar* row = img.ptr<uchar>(y); 
     for (int x = 0; x < img.cols; ++x) 
     { 
      if (row[x] == white) 
      { 
       floodFill(img, Point(x, y), Scalar(0), (Rect*)0, Scalar(), Scalar(200)); 
      } 
     } 
    } 
    // fix left and right sides 
    for (int y = 0; y < img.rows; ++y) 
    { 
     uchar* row = img.ptr<uchar>(y); 
     for (int x = 0; x < img.cols; x += img.cols - 1) 
     { 
      if (row[x] == white) 
      { 
       floodFill(img, Point(x, y), Scalar(0), (Rect*)0, Scalar(), Scalar(200)); 
      } 
     } 
    } 

この画像の

実行たTesseractが、これはあなたの問題を解決するのに役立ちます'T'代わりの'I' 希望になります。 :)

+0

これは機能しますが、コードの理解は弱いと思います。例えば、(int y = 0; y (y); (x、y)、Scalar(0)、floatFill(img、Point(x、y))、floatFill(img、Point(x、y)、floatFill) (Rect *)0、Scalar()、Scalar(200)); } } }これで画像全体が黒くなるはずですか?または私はここに何かを逃していますか? Janco de Vries – Ahsan

+0

floodfillは、ブロブが境界線に接続されている場合にのみ塗りつぶす(黒くする)必要があります。ここに示した例でわかるように、文字 'T'は画像に残ります。 –

関連する問題