2

我正在为我的应用程序使用 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,但结果是一样的。

我想问是否有办法解决这个问题并让这个过程更有效率。

谢谢

4

1 回答 1

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。

于 2013-08-12T09:12:18.203 回答