2012-10-03 55 views
5

私はリアルタイムOCRを使用してAndroidアプリケーションを開発中です。 OpenCVとTesseractライブラリを使用しています。しかし、私のギャラクシーSIIIでさえ、パフォーマンスは非常に悪いです。パフォーマンスを向上させる方法はありますか?それは私のコードです:AndroidでOpenCVでTesseractの性能を向上させる

Mat mGray = new Mat(); 
capture.retrieve(mGray); 
Bitmap bmp = Bitmap.createBitmap(mGray.cols(), mGray.rows(), Bitmap.Config.ARGB_8888); 
tessBaseApi.setImage(bmp); 
String recognizedText = tessBaseApi.getUTF8Text(); 
Log.i("Reg", recognizedText); 

たTesseract OCRの速度がたTesseract APIにビットマップを渡すことによって削減されますか? Tesseract APIに渡す前に何を前処理する必要がありますか?

+0

スピードや認識精度についてお話ししていますか? – rmtheis

+1

私はスピードを取っています、それは非常に遅いです。 –

+0

こんにちは@QuiLlHoNこのような低速性能の解決策はありましたか?私は同じ問題に遭遇しています:/ – Vucko

答えて

0

それが高速化させる可能性があるいくつかのもの:

  • あなたのテキストがcreateBitmap前に、あるmGrayからより小さな領域を選択 - そう小さい画像を処理従うより重い方法を。
  • Bitmap.Config.ARGB_8888をBitmap.Config.RGB_565に変更する - 画像がグレースケールであるため、ARGBビットマップは必要ありません。それはrecog_all_words()を呼び出したときに、2〜9 を渡しスキップするようにあなたがたTesseractを持つことができ
+0

TessBaseAPIはARGB_8888イメージのみを受け入れます。テキスト領域を見つけるアルゴリズムはありますか?ありがとうございました。 –

1

は、認識パス1を実行します。

変更baseapi.cpp に次の行と、あなたたTesseractライブラリプロジェクト再構築:へ

if (tesseract_->recog_all_words(page_res_, monitor, NULL, NULL, 0)) { 

変更、それを:しようとする

if (tesseract_->recog_all_words(page_res_, monitor, NULL, NULL, 1)) { 
+0

私はコードを編集し、ライブラリを再構築しました。しかし、速度はまだ非常に遅い。 –

2

ことの一つは、適応しきい値を使用して画像を2値化することである(adaptiveThresholdをOpenCVで)。

+1

Tesseractはすでにこれを内部的に実行しています。大津の閾値を使う。 https://code.google.com/p/tesseract-ocr/source/browse/ccstruct/otsuthr.cpp – Raghav

+0

大津の方法では、1つのグローバルしきい値が使用されます。照明が完全に統一されていない場合は、適応型閾値処理と同様に機能しません(例についてはhttp://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html#adaptive-thresholdingを参照) – ojs

+0

実際大津は素晴らしいとは言えませんが、まだまだ速いです。したがって、精度の問題を解決することはできますが、パフォーマンスに大きな影響はありません。 –

0

マルチスレッドを使用しますが、TessBaseAPIのスレッドごとに1つのインスタンスを作成することに注意してください。異なるスレッド間でそれらを共有しないでください。 N個のスレッド(N> =コアの数)を作成すると、javaは少なくともコア数をスピードアップすることを確認します。

TessBaseAPIオブジェクトを独自のコンテキスト(runメソッド内)で作成し、中断されるまでループ内でOCR要求を待機するN個のスレッドを作成しています。

... 
    ... 
    @Override 
    public void run() { 

     TessBaseAPI tessBaseApi = new TessBaseAPI(); 

     tessBaseApi.init(Ocrrrer.DATA_PATH, "eng"); 

     setTessVariable(tessBaseApi, "load_system_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_freq_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_unambig_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_punc_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_number_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_fixed_length_dawgs", "0"); 
     setTessVariable(tessBaseApi, "load_bigram_dawg", "0"); 
     setTessVariable(tessBaseApi, "wordrec_enable_assoc", "0"); 
     setTessVariable(tessBaseApi, "tessedit_enable_bigram_correction", "0"); 
     setTessVariable(tessBaseApi, "assume_fixed_pitch_char_segment", "1"); 
     setTessVariable(tessBaseApi, TessBaseAPI.VAR_CHAR_WHITELIST, "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ<"); 

     Log.d(TAG, "Training file loaded"); 


     while (!interrupted()) { 
     reentrantLock.lock(); 
     try { 
      Log.d(TAG, this.getName() + " wait for OCR"); 
      jobToDo.await(); 
      Log.d(TAG, this.getName() + " input arrived. Do OCR"); 
      this.ocrResult = doOcr(tessBaseApi); 
      ocrDone.signalAll(); 
     } catch (InterruptedException e) { 
      return; 
     } finally { 
      try { 
      reentrantLock.unlock(); 
      } catch (Exception ex) { 
      } 
     } 
     } 

    } 
    ... 
    ... 

tessBaseApiオブジェクトはrunメソッドにとってローカルなので、絶対に共有されていないことがわかります。

関連する問題