2

我爲我的應用程序使用OpenCV,Vuforia和Tesseract(tess-two)。我的系統是這樣工作的:用多線程處理Android相機幀

  1. Vuforia檢測目標,並將全幀的OpenCV(JNI)
  2. OpenCV的獲取框架,並做了一些圖像處理,使其可讀的正方體(JNI)
  3. Tesseract(tess-two)從opencv獲取字節數組,並對圖像執行OCR處理(字節數組)

我的問題從第三部分開始。由於我的目標是實時拍攝相機畫面,所以我嘗試使用多線程來使UI平滑,並且不會導致實時相機視覺變慢。

我決定使用的AsyncTask的,像這樣:

public void getFromNative(final byte[] imagedata, final int width,final int height,final byte [] typeData, final int typeWidth,final int typeHeight) { 

     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       ocr(imagedata, width, height,typeData,typeWidth,typeHeight);      
       return null; 
      } 

     }.execute();     
} 

這讓直播相機流比正常的,單個線程的方式平滑。但問題在於,由於實時攝像機幀的啓動,它啓動了很多AsyncTask,即使我將攝像機從目標轉離時,它也會繼續對先前創建的AsycnTask執行OCR,併爲它們一個接一個地返回結果。除了AsyncTask之外,我嘗試了IntenService,但結果是一樣的。

我想問問是否有辦法解決這個問題,並使過程更有效率。

感謝

回答

0

我的建議,你不要試圖識別每一個單幀相機peview取。我們使用以下onPreviewFrame-method:

public final void onPreviewFrame(final byte[] data, final Camera camera) { 
    this.data = data; 
    now = Calendar.getInstance().getTimeInMillis(); 

    if (now - lastRecognitionTime > TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS) { 
     lastRecognitionTime = now; 
     startRecognition(); // here you can start your async task 
    } 
} 

這意味着識別過程只啓動每隔幾個預覽畫面,這取決於你如何配置TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS類似的東西。

+0

謝謝你的建議,但我仍然沒有看到這麼多的性能增加,問題是特別是與沒有這麼好的相機和舊設備的設備。我在想也許這個解決方案使用的是不同於AsyncTask的多線程技術。 – koraxis

+0

當設備相對穩定並且移動不太多時,我們只識別幀。此外,我們只分析那些我們確信(或多或少)會使圖片清晰的幀。 –