簡體   English   中英

具有多線程的Android相機幀處理

[英]Android Camera Frame processing with MultiThreading

我正在為我的應用程序使用OpenCV,Vuforia和Tesseract(tess-two)。 我的系統是這樣的:

  1. Vuforia檢測到目標並將完整幀發送到OpenCV(JNI)
  2. OpenCV獲取幀並進行一些圖像處理以使其對Tesseract(JNI)可讀
  3. Tesseract(tess-two)從opencv獲取字節數組,並在圖像上進行OCR處理(字節數組)

我的問題從第三部分開始。 由於我的目標是在實時攝像機幀上進行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,但結果是相同的。

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

謝謝

我建議您不要嘗試識別相機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的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM