2016-04-07 6 views
1

OpenCVとTesseractを使用して画像からテキストを抽出しようとしています。私は、テキスト領域を検出し、バウンディングボックスを使用してそれらを区切りました。しかし今では、境界ボックスをTesseractに渡す方法を見つけることができません。OpenCVバウンディングボックスで画像をtesseractに渡すOCR

 for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) 
     { 
      Rect rect = boundingRect(contours[idx]); 
      Mat maskROI(mask, rect); 
      maskROI = Scalar(0, 0, 0); 
      // fill the contour 
      drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED); 
      // ratio of non-zero pixels in the filled region 
      double r = (double)countNonZero(maskROI)/(rect.width*rect.height); 

      if (r > .45 /* assume at least 45% of the area is filled if it contains text */ 
       && 
       (rect.height > 8 && rect.width > 8) /* constraints on region size */ 
       /* these two conditions alone are not very robust. better to use something 
       like the number of significant peaks in a horizontal projection as a third condition */ 
       ) 
      { 
       rectangle(rgb, rect, Scalar(0, 255, 0), 2); 
      } 
     } 
     imwrite(OUTPUT_FOLDER_PATH + string("/rgb.jpg"), rgb); 
    return 0; 
    } 

バウンディングボックスで非常に良い結果が得られました。バウンディングボックスと画像:

enter image description here

そしてはcv::text::OCRTesseract::run試みたが、それが動作するようには思えません。

誰でもアイデアはありますか?

編集:会社の私は私に尋ねられたインターンシップにいるので、ほとんどのコードを削除する必要がありました。しかし、これは私の年末プロジェクトの終わりです。その年が終わるとすぐに、プロジェクト全体のgithubリンクで投稿を編集します。

+0

トリミングされた画像を渡せませんか? – Miki

+0

このコードには切り抜かれた画像はありません。テキスト領域のみを検出して輪郭線を作成する/ – user3491634

+0

はい、表示されます...各矩形でイメージをトリミングできず、各トリミングをtesseractに渡すことはできませんか? – Miki

答えて

2

まず、mikiのおかげです。これが私がこの問題を解決するためにしたものです。

  1. すべての境界ボックスのオリジナル画像をトリミングします。 image.Toの多くのテキスト領域は、これを行うために、これは私に別々の画像を与えるだろう、ちょうどOCRTesseractクラスのインスタンスを作成したTesseractエンジンを初期化し、このラインrectangle(rgb, rect, Scalar(0, 255, 0), 2);

  2. Mat cropedImage = small(Rect(rect));を置きます。これを行うには、この行をPtr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create(NULL,NULL,NULL,3,3);に追加してください(あなたのメインの前に配置することをお勧めしますが、このコードのforループの前に置くことができます)。パラメータは必須ではありませんので、Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create();と入力してください。

    1. エンジンが完成しました。 OCRを実行できます。多くのパラメータで実行することができますが、私は基本的なもの、つまり入力イメージと出力テキストに固執するつもりです。だから、あなたは今、二値画像にOCR(値化に渡す前にトリミングされた画像を処理することが好ましいことに注意してくださいこの1つだけMat cropedImage = small(Rect(rect));

の下に、この行tess->run(cropedImage, output_string);を追加することができますので、作物を拡大テキストがエッジに触れない)

0

cv :: text :: OCRTesseract :: runを使用するには、OpenCVの追加モジュールが必要です。 hereからダウンロードできます。

このページの下部にあるチュートリアルでは、OpenCVで使用するためにlinuxにインストールする方法を説明します。私が覚えていることから、あなたはOpenCVのインストール中にそれらを構築する必要があります。これらのモジュールはOpenCV3専用です。

窓の手順については、hereをご覧ください。

関連する問題